使用sed和grep / egrep进行搜索和替换

时间:2009-07-23 06:19:27

标签: regex sed grep

我正在使用egrep -R后面跟一个包含大约10个联合的正则表达式,所以像: .jpg | .png | .gif等。这很有效,现在我想替换.bmp

找到的所有字符串

我在考虑像

这样的东西
egrep -lR "\.jpg|\.png|\.gif" . | sed "s/some_expression/.jpg/" file_it_came_form

所以这里的问题是如何在sed中执行类似的联合正则表达式,如何告诉它将更改保存到从中获取输入的文件。

6 个答案:

答案 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_regexreplacement_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