使用SED和grep / egrep的搜索和替换

问题描述 投票:94回答:6

我使用egrep -R其次是含有约10工会正则表达式,所以像:.jpg | .png | .gif等,这工作得很好,现在我想以取代.bmp发现的所有字符串

我想的是一样的东西

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

所以这里的问题是,我该怎么做sed类似工会的正则表达式,如何告诉它更改保存到它从得到的输入文件。

regex sed grep
6个回答
180
投票

使用此命令:

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:执行与所述标准输入作为参数的命令 -0:使用\0作为记录分隔符。这一点很重要,以匹配-Zegrep并避免在输入文件名空格和换行被愚弄。 -l:使用每一个命令行参数
  • sed:流编辑器 -i:替换输出输入文件而不制作备份 -e:使用下面的参数作为表达 's/\.jpg\|\.gif\|\.png/.bmp/g':更换琴弦".jpg"".gif"".png"".bmp"所有出现

11
投票

说实话,虽然我爱SED适当的任务,这绝对是perl的任务 - 这是这种单行真正的功能更强大,尤其是“写回它来自哪里”(Perl的-i开关做它为你,必要时也可以让你保持旧版本,例如周围标有.bak的,只是使用-i.bak代替)。

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

而不是在sed复杂的工作(如果甚至有可能出现),或AWK ...


10
投票

另一种方式来做到这一点

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.../字符串被替换


5
投票

我无法得到任何命令的此页面上为我工作:sed solution添加一个新行到它的所有处理的文件的末尾,而perl solution无法从发现接受足够的议论。我发现这个解决方案,它完美的作品:

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

这将递归下降的当前目录树,并在search_regexreplacement_string后缀的文件与.h替换.m

我也用rpl为此,在过去。


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

不漂亮,但应该做的。


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'

希望帮助。

UPDATE S |富:/驱动器号:|富:/ BA /巴兹/ XYZ | G

© www.soinside.com 2019 - 2024. All rights reserved.