Grep
grep 管道進入 sed,替換內聯;但我想 sed 列印文件名和更改的行。可能嗎?
這是我的命令(故意中斷):
grep FOO "/Users/gjtorikian/blah" -l | xargs sed -i '' '/FOO/{s/FOO/BAR/g; w /dev/stdout }'
高層:
grep
對於blah
目錄中的 FOO;只輸入文件名(因為-l
)到sed
;sed
執行內聯替換 ( ) 並僅將更改後的術語-i ''
列印到./dev/stdout
如果我要省略
-l
and 管道,我會從grep
:/Users/gjtorikian/blah/baz.cs:1:FOO /Users/gjtorikian/blah/bar.js:1:FOO
我想要的是
sed
執行內聯替換,然後向我顯示替換的文件和術語;例如:/Users/gjtorikian/blah/baz.cs:1:BAR /Users/gjtorikian/blah/bar.js:1:BAR
這樣的事情可能嗎?如果它很重要,我寧願只保留它
grep
/sed
。我必須在grep
之後做一秒鐘sed
嗎?
一種可能性是將 的輸出傳遞
grep
給單獨的sed
過濾器。grep -l FOO "/Users/gjtorikian/blah/"* | { tee /dev/fd/3 | xargs sed -i -e '/FOO/{' -e 's/FOO/BAR/g' -e 'w /dev/stdout' } 3>&1 | sed 's/:FOO$/:BAR/'
您可以在找到匹配項時
sed
列印行號(使用命令)並進行進一步的後處理。=
使用 awk 可能會更清楚。
for x in "/Users/gjtorikian/blah/"*; do awk ' sub(/FOO/, "BAR") {found=1; print FILENAME ":" NR ":" "BAR" >"/dev/stderr"} 1 {print} END {exit(!found)} ' "$x" >"$x.tmp" && mv "$x.tmp" "$x" done