将文件读入 JSON
Read files into JSON
我想读入几个文件(index.html、style.css、main.js)以创建一个 JSON 有效载荷以供上传。
我知道使用 nodejs,我可以像这样开始创建我想要的东西:
var fs = require('fs');
fs.readFile('index.html', 'utf8', function (err, data) {
if (err) throw err;
out = JSON.stringify({"html": data});
console.log(out);
});
虽然我如何使用 jq 做到这一点?
使用原始输入 (-R
) 命令行选项将输入作为字符串读取。然后你可以构建你的 json 结果。对于多行文本文件,您也需要使用它 (-s
)。
$ jq -Rs '{ html: . }' index.html
但是,这仅适用于文本文件。如果您有二进制文件,则必须先对它们进行编码。您可以使用 base64
来这样做。
$ base64 -w0 image.jpg | jq -R '{ jpg: . }'
这应该适合你(需要 jq 1.5):
jq --null-input --raw-input \
'reduce inputs as $line ({}; .[input_filename] += [$line]) | map_values(join("\n"))' \
index.html style.css main.js
这是过滤器本身。这很简单:
reduce inputs as $line ({}; .[input_filename] += [$line])
| map_values(join("\n"))
示例:
$ cat test1.txt
foo
bar
baz
$ cat test2.txt
qux
quux
quuux
$ jq --null-input --raw-input \
'reduce inputs as $line ({}; .[input_filename] += [$line]) | map_values(join("\n"))' \
test1.txt test2.txt
{
"test1.txt": "foo\nbar\nbaz",
"test2.txt": "qux\nquux\nquuux"
}
P.S。如果您不介意尾随的换行符,您可以这样做:
reduce inputs as $line ({}; .[input_filename] += "\($line)\n")
处理多个文本文件的一种方法如下所示:
(jq -Rs . a.txt ; jq -sR . b.txt) | jq -s
[
"1\n2\n",
"3\n4\n"
]
所以在你的情况下你会做这样的事情:
(jq -Rs '{ html: . }' index.html; \
jq -Rs '{ javascript: . }' main.js; \
jq -Rs '{ css: . }' style.css) |\
jq -s add
也就是将每个文本文件分别转换成JSON字符串,然后将这些字符串pipe给jq。这具有不需要 jq 1.5 的优点,但如果您有 jq 1.5,那么使用过滤器 inputs
的解决方案可能更可取。
我想读入几个文件(index.html、style.css、main.js)以创建一个 JSON 有效载荷以供上传。
我知道使用 nodejs,我可以像这样开始创建我想要的东西:
var fs = require('fs');
fs.readFile('index.html', 'utf8', function (err, data) {
if (err) throw err;
out = JSON.stringify({"html": data});
console.log(out);
});
虽然我如何使用 jq 做到这一点?
使用原始输入 (-R
) 命令行选项将输入作为字符串读取。然后你可以构建你的 json 结果。对于多行文本文件,您也需要使用它 (-s
)。
$ jq -Rs '{ html: . }' index.html
但是,这仅适用于文本文件。如果您有二进制文件,则必须先对它们进行编码。您可以使用 base64
来这样做。
$ base64 -w0 image.jpg | jq -R '{ jpg: . }'
这应该适合你(需要 jq 1.5):
jq --null-input --raw-input \
'reduce inputs as $line ({}; .[input_filename] += [$line]) | map_values(join("\n"))' \
index.html style.css main.js
这是过滤器本身。这很简单:
reduce inputs as $line ({}; .[input_filename] += [$line])
| map_values(join("\n"))
示例:
$ cat test1.txt
foo
bar
baz
$ cat test2.txt
qux
quux
quuux
$ jq --null-input --raw-input \
'reduce inputs as $line ({}; .[input_filename] += [$line]) | map_values(join("\n"))' \
test1.txt test2.txt
{
"test1.txt": "foo\nbar\nbaz",
"test2.txt": "qux\nquux\nquuux"
}
P.S。如果您不介意尾随的换行符,您可以这样做:
reduce inputs as $line ({}; .[input_filename] += "\($line)\n")
处理多个文本文件的一种方法如下所示:
(jq -Rs . a.txt ; jq -sR . b.txt) | jq -s
[
"1\n2\n",
"3\n4\n"
]
所以在你的情况下你会做这样的事情:
(jq -Rs '{ html: . }' index.html; \
jq -Rs '{ javascript: . }' main.js; \
jq -Rs '{ css: . }' style.css) |\
jq -s add
也就是将每个文本文件分别转换成JSON字符串,然后将这些字符串pipe给jq。这具有不需要 jq 1.5 的优点,但如果您有 jq 1.5,那么使用过滤器 inputs
的解决方案可能更可取。