2017-02-13 44 views
0

我有一組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" 

試着回聲,但似乎像輸出重定向到管道。我應該回應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" 

這不是容易閱讀。

回答

1

用於打印文件名並處理其內容的while循環會更好。

find ./fixtures/*.json | while read f ; do echo -n "$f: " ; cat "$f" | jq .[0].terms.customer[0].slug ; done 
2

可以在xargs命令使用sed這樣的:

find fixtures -name '*.json' -print0 | 
xargs -0 -I % bash -c 'sed "s~^~$1: ~" < <(jq ".[0].terms.customer[0].slug" "$1")' - % 

它是如何工作的:

  • print0xargs -0建議處理與白色的文件名 - 空格或特殊字符。
  • sed命令在jq的輸出上運行,並用文件名和冒號替換每行。
  • %之前的連字符只是bash -c命令行的佔位符,該命令行將$0填充爲連字符。
+1

很好的回答。請在'%'之前添加關於爲什麼需要'-'的解釋。 – codeforester

+1

感謝@codeforester,回答編輯。 – anubhava