使用sed和grep来search和replace

我正在使用egrep -R然后是包含约10个联合的正则expression式,如下所示: .jpg | .png | .gif .jpg | .png | .gif .jpg | .png | .gif等。这工作得很好,现在我想用.bmpreplace所有find的string

我正在想着类似的东西

 egrep -lR "\.jpg|\.png|\.gif" . | sed "s/some_expression/.jpg/" file_it_came_form 

所以这里的问题是我如何在sed做类似的联合正则expression式,以及如何告诉它保存对获得input的文件的更改。

使用这个命令:

 egrep -lRZ "\.jpg|\.png|\.gif" . \ | xargs -0 -l sed -i -e 's/\.jpg\|\.gif\|\.png/.bmp/g' 
  • egrep :使用扩展正则expression式find匹配的行

    • -l :只列出匹配的文件名

    • -R :通过所有给定的目录recursionsearch

    • -Z :使用\0作为logging分隔符

    • "\.jpg|\.png|\.gif" :匹配其中一个string".jpg"".gif"".png"

    • . :在当前目录中开始search

  • xargs :用stdin作为参数执行命令

    • -0 :使用\0作为logging分隔符。 匹配egrep-Z是很重要的,并且避免被input文件名中的空格和换行符所迷惑。

    • -l :每个命令使用一行作为参数

  • sed编辑

    • -i :用输出replaceinput文件而不进行备份

    • -e :使用下面的参数作为expression式

    • 's/\.jpg\|\.gif\|\.png/.bmp/g' :将所有出现的string".jpg"".gif"".png"replace为".bmp"

老实说,就像我喜欢sed适当的任务一样,这对perl来说绝对是一个任务 – 对于这种单线程来说,这真的是更强大的function,特别是“把它写回来的地方”(perl's -i switch does它为你,也可以让你保持旧的版本,例如附加一个.bak,而不是使用-i.bak )。

 perl -i.bak -pe 's/\.jpg|\.png|\.gif/.jpg/ 

而不是在sed复杂的工作(如果甚至有可能)或awk …

另一种方法来做到这一点

 find . -name *.xml -exec sed -i "s/4.6.0-SNAPSHOT/5.0.0-SNAPSHOT/" {} \; 

有关上述命令的一些帮助

查找将会在当前目录下find你.

-name在我的情况下命名文件的名称它的pom.xml可以给通配符。

执行

sedstream编辑器

-i忽略了情况

s是替代品

/4.6.0.../要search的string

/5.0.0.../要replace的string

我无法得到这个页面上的任何命令为我工作: sed解决scheme添加了一个换行符到它处理的所有文件的末尾,并且perl解决scheme无法从find中接受足够的参数。 我发现这个完美的解决scheme:

 find . -type f -name '*.[hm]' -print0 | xargs -0 perl -pi -e 's/search_regex/replacement_string/g' 

这将caching当前目录树,并以任何以.h.m结尾的文件中的.hreplacesearch_regex

过去我也使用过rpl 。

尝试使用for循环

  for i in `egrep -lR "YOURSEARCH" .` ; do echo $i; sed 's/f/k/' <$i >/tmp/`basename $i`; mv /tmp/`basename $i` $i; done 

不漂亮,但应该做的。

我的用例是我想用foo:/Drive_Letterreplacefoo:/Drive_Letter foo:/bar/baz/xyz在我的情况下,我可以用下面的代码来完成。 我在相同的目录位置有大量的文件。

 find . -name "*.library" -print0 | xargs -0 sed -i '' -e 's/foo:\/Drive_Letter:/foo:\/bar\/baz\/xyz/g' 

希望有所帮助。

更新s | foo:/ Drive_letter:| foo:/ ba / baz / xyz | g