组合grep和sed时如何使用变量名?

时间:2015-11-02 08:18:48

标签: regex bash sed

我想搜索一个字符串,并在递归的目录中的所有文件中用不同的字符串替换它。我可以像这样在一个文件上使用sed,它可以工作:

sed -i "s|${searchStr}|${replaceStr}|g" "${rootDir}"file.cs

但是当我使用grep时,我没有看到文件中的更改或收到任何错误消息。

此作品

grep -rnlis --include=*.{html,css,js,aspx} './' -e "/images/" |
 xargs -i@ sed -i "s|/images/|https://example.com/Images/|I" @

尝试了这些,但没有奏效:

searchStr='/images/'
replaceStr='https://example.com/Images/'
...  -e "$searchStr" | xargs -i@ sed -i "s|$searchStr|$replaceStr|I" @

...  -e "${searchStr}" | xargs -i@ sed -i "s|${searchStr}|${replaceStr}|I" @
与表达式中的变量名一起使用时,

错误消息

: No such file or directoryult.js

: No such file or directoryders.aspx

: No such file or directoryork.css

: No such file or directoryal-power.js

如何使用变量名而不是硬编码?

环境:cygwin(所以Windows GNU sed / grep)

1 个答案:

答案 0 :(得分:1)

感谢@NeronLeVelu,这是解决方案:

searchStr='/images/' replaceStr='https://example.com/Images/' grep -rnlis --include=*.{html,css,js,aspx} "$rootDir" -e "/images/" | while read File; do sed -i "s|${searchStr}|${replaceStr}|I" "${File}"; done

它完美无缺,并以递归方式替换rootDir中的searchStr。