我有一组json文件,我想对它们执行一些操作(提取标记)。命令如下所示:
find ./fixtures/*.json | xargs cat | jq .[0].terms.customer[0].slug
.[0].terms.customer[0].slug
是我的查询,在这里并不重要。上面的命令工作正常。输出类似于:
"default"
"default"
"default"
"default"
"foo"
"foo"
"bar"
但是如何更改上面的shell命令以显示已处理文件的文件名?我希望看到这样的输出:
1.json: "default"
2.json: "default"
3.json: "default"
4.json: "default"
5.json: "foo"
6.json: "foo"
7.json: "bar"
尝试使用echo,但似乎输出被重定向到管道。我应该回应stderr或更好的方法吗?
当我对tee
使用find ./fixtures/*.json | tee /dev/tty | xargs cat | jq .[0].terms.customer[0].slug
命令时,它会向我显示:
1.json
2.json
3.json
4.json
5.json
6.json
"default"
"default"
"default"
"default"
"foo"
"foo"
"bar"
这不容易阅读。
答案 0 :(得分:2)
您可以在sed
命令中使用xargs
,如下所示:
find fixtures -name '*.json' -print0 |
xargs -0 -I % bash -c 'sed "s~^~$1: ~" < <(jq ".[0].terms.customer[0].slug" "$1")' - %
工作原理:
print0
和xargs -0
来处理带有空格或特殊字符的文件名。sed
命令在jq
的输出上运行,并用文件名和冒号替换每一行。%
之前的连字符只是bash -c
命令行的占位符,它将$0
填充为连字符。答案 1 :(得分:1)
用于打印文件名和处理其内容的while循环会更好。
find ./fixtures/*.json | while read f ; do echo -n "$f: " ; cat "$f" | jq .[0].terms.customer[0].slug ; done