Grep

grep 管道進入 sed,替換內聯;但我想 sed 列印文件名和更改的行。可能嗎?

  • April 29, 2020

這是我的命令(故意中斷):

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

如果我要省略-land 管道,我會從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

引用自:https://unix.stackexchange.com/questions/32666