使用sed和grep来search和replace
我正在使用egrep -R
然后是包含约10个联合的正则expression式,如下所示: .jpg | .png | .gif
.jpg | .png | .gif
.jpg | .png | .gif
等。这工作得很好,现在我想用.bmp
replace所有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可以给通配符。
执行
sed
stream编辑器
-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
结尾的文件中的.h
replacesearch_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_Letter
replacefoo:/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