当不支持 -i 参数时,如何使用 grep 和 sed 替换多个文件中的字符串



我试过这个命令,

grep '/static' dir/* | xargs sed -i 's//static//g'

但是我使用的 sed 版本不支持 -i 参数。

要将文件中的字符串替换为与输出相同的输入文件,我通常这样做:

sed 's//static//g' filename.txt > new_filename.txt ; mv new_filename.txt filename.txt

OS X的sed版本确实支持-i,但它需要一个参数来告诉它备份文件使用什么文件扩展名(或""没有备份)。顺便说一句,您希望grep -l只获取文件名。

grep -l '/static' dir/* | xargs sed -i "" 's//static//g'

使用 perl:

$ perl -pi.bak -e 's@/static@@g' dir/*

您可以使用循环来执行此操作:

for file in $(grep -l '/static' dir/*) ; do
    sed 's//static//g' $file > $file.$$ && mv $file.$$ $file
done

我使用 .$$ 后缀($$ 是当前 shell 的进程 ID)来避免与现有文件名发生冲突,并且&&而不是;以避免在 sed 命令由于某种原因失败时破坏输入文件。我还添加了-l以便 grep 打印文件名而不是匹配行。

或者你可以安装 GNU sed(我不确定如何在 OSX 上做到这一点)。

最新更新