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

时间:2012-08-13 21:05:47

标签: macos unix sed grep

我试过这个命令,

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

3 个答案:

答案 0 :(得分:23)

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

grep -l

答案 1 :(得分:3)

使用perl:

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

答案 2 :(得分:1)

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

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上做到这一点)。