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

Ori*_*Ori 95 regex grep sed

我正在使用egrep -R一个包含大约10个联合的正则表达式,所以像: .jpg | .png | .gif等.这很好用,现在我想替换所有找到的字符串.bmp

我在想类似的东西

egrep -lR "\.jpg|\.png|\.gif" . | sed "s/some_expression/.jpg/" file_it_came_form
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*itt 181

使用此命令:

egrep -lRZ "\.jpg|\.png|\.gif" . \
    | xargs -0 -l sed -i -e 's/\.jpg\|\.gif\|\.png/.bmp/g'
Run Code Online (Sandbox Code Playgroud)
  • egrep:使用扩展正则表达式查找匹配行

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

    • -R:递归搜索所有给定目录

    • -Z:\0用作记录分隔符

    • "\.jpg|\.png|\.gif":匹配其中一个字符串".jpg",".gif"".png"

    • .:在当前目录中开始搜索

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

    • -0:\0用作记录分隔符.这一点很重要,以匹配-Zegrep,并避免在输入文件名空格和换行被愚弄.

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

  • sed:在小号 tream itor

    • -i:使用输出替换输入文件而不进行备份

    • -e:使用以下参数作为表达式

    • 's/\.jpg\|\.gif\|\.png/.bmp/g':替换所有出现的字符串".jpg",".gif"或者".png"".bmp"


Ale*_*lli 11

老实说,就像我喜欢sed的合适任务一样,这绝对是perl的任务 - 对于这种单行程来说它真的更强大,特别是"把它写回来它的位置"(perl的-i开关是为了它你,也可以选择让你保留旧版本,例如附加.bak,只需使用-i.bak).

perl -i.bak -pe 's/\.jpg|\.png|\.gif/.jpg/
Run Code Online (Sandbox Code Playgroud)

而不是在sed中复杂的工作(如果可能的话)或awk ......

  • sed使用-i,就像perl一样. (6认同)

小智 10

另一种方法

find . -name *.xml -exec sed -i "s/4.6.0-SNAPSHOT/5.0.0-SNAPSHOT/" {} \;
Run Code Online (Sandbox Code Playgroud)

关于上述命令的一些帮助

find将在当前目录中为您执行查找 .

-name 在我的情况下,文件的名称,其pom.xml可以提供通配符.

-exec 执行

sed 流编辑器

-i 忽略案例

s 是替代品

/4.6.0.../ 要搜索的字符串

/5.0.0.../ 要替换的字符串


tit*_*coy 5

我无法让这个页面上的任何命令为我工作:sed解决方案在它处理的所有文件的末尾添加了换行符,并且perl解决方案无法接受来自find的足够参数.我发现这个解决方案完美无缺:

find . -type f -name '*.[hm]' -print0 
    | xargs -0 perl -pi -e 's/search_regex/replacement_string/g'
Run Code Online (Sandbox Code Playgroud)

这将递归当前目录树并替换search_regexreplacement_string.h或结尾的任何文件.m.

我过去也曾为此目的使用过rpl.