我正在使用egrep -R
后面跟一个包含大约10个联合的正则表达式,所以像:
.jpg | .png | .gif
等。这很有效,现在我想替换.bmp
我在考虑像
这样的东西egrep -lR "\.jpg|\.png|\.gif" . | sed "s/some_expression/.jpg/" file_it_came_form
所以这里的问题是如何在sed
中执行类似的联合正则表达式,如何告诉它将更改保存到从中获取输入的文件。
答案 0 :(得分:179)
使用此命令:
egrep -lRZ "\.jpg|\.png|\.gif" . \
| xargs -0 -l sed -i -e 's/\.jpg\|\.gif\|\.png/.bmp/g'
egrep
:使用扩展正则表达式查找匹配的行
-l
:仅列出匹配的文件名
-R
:递归搜索所有给定目录
-Z
:使用\0
作为记录分隔符
"\.jpg|\.png|\.gif"
:匹配其中一个字符串".jpg"
,".gif"
或".png"
.
:在当前目录中开始搜索
xargs
:以stdin作为参数执行命令
-0
:使用\0
作为记录分隔符。这对于匹配-Z
的{{1}}非常重要,以避免被输入文件名中的空格和换行符所迷惑。
egrep
:每个命令使用一行作为参数
-l
: s tream ed itor
sed
:将输入文件替换为输出而不进行备份
-i
:使用以下参数作为表达式
-e
:将所有字符串's/\.jpg\|\.gif\|\.png/.bmp/g'
,".jpg"
或".gif"
替换为".png"
答案 1 :(得分:11)
老实说,就像我喜欢sed做适当的任务一样,这绝对是perl的任务 - 对于这种单行程来说它真的更强大,特别是“把它写回来它的位置”(perl's { {1}}切换为您执行此操作,并且可选地还允许您保留旧版本,例如附加.bak,而只需使用-i
。
-i.bak
而不是在sed中复杂的工作(如果可能的话)或awk ......
答案 2 :(得分:9)
另一种方法
find . -name *.xml -exec sed -i "s/4.6.0-SNAPSHOT/5.0.0-SNAPSHOT/" {} \;
关于上述命令的一些帮助
查找将在.
-name
在我的情况下,文件的名称,其pom.xml可以提供外卡。
-exec
执行
sed
流编辑器
-i
忽略大小写
s
代替
/4.6.0.../
要搜索的字符串
/5.0.0.../
要替换的字符串
答案 3 :(得分:5)
我无法让此页面上的任何命令对我有用:sed solution在其处理的所有文件的末尾添加了换行符,perl solution无法接受来自find的足够论据。我发现这个解决方案完美无缺:
find . -type f -name '*.[hm]' -print0
| xargs -0 perl -pi -e 's/search_regex/replacement_string/g'
这会递归当前目录树,并在search_regex
或replacement_string
结尾的任何文件中将.h
替换为.m
。
我过去也曾为此目的使用过rpl。
答案 4 :(得分:0)
使用for循环尝试一些东西
for i in `egrep -lR "YOURSEARCH" .` ; do echo $i; sed 's/f/k/' <$i >/tmp/`basename $i`; mv /tmp/`basename $i` $i; done
不漂亮,但应该这样做。
答案 5 :(得分:0)
我的用例是我想要替换
foo:/Drive_Letter
foo:/bar/baz/xyz
find . -name "*.library" -print0 | xargs -0 sed -i '' -e 's/foo:\/Drive_Letter:/foo:\/bar\/baz\/xyz/g'
在我的情况下,我能够使用以下代码完成它。
我在大量文件的同一目录位置。
{{1}}
希望有所帮助。
UPDATE s | foo:/ Drive_letter:| foo:/ ba / baz / xyz | g