我正在使用egrep -R
命令,后跟包含约10个联合的正则表达式,例如:.jpg | .png | .gif
等。这很有效,现在我想用.bmp
替换找到的所有字符串。
我考虑了以下方法:
egrep -lR "\.jpg|\.png|\.gif" . | sed "s/some_expression/.jpg/" file_it_came_form
所以这里的问题是如何在sed
中执行类似的联合正则表达式,并告诉它将更改保存到输入它的文件中。
我正在使用egrep -R
命令,后跟包含约10个联合的正则表达式,例如:.jpg | .png | .gif
等。这很有效,现在我想用.bmp
替换找到的所有字符串。
我考虑了以下方法:
egrep -lR "\.jpg|\.png|\.gif" . | sed "s/some_expression/.jpg/" file_it_came_form
所以这里的问题是如何在sed
中执行类似的联合正则表达式,并告诉它将更改保存到输入它的文件中。
使用以下命令:
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
作为记录分隔符。这对于匹配egrep
的-Z
并避免受到输入文件名中的空格和换行符的干扰非常重要。
-l
:使用每个命令一行作为参数
sed
:流编辑器
-i
:替换输入文件而不进行备份
-e
:使用以下参数作为表达式
's/\.jpg\|\.gif\|\.png/.bmp/g'
:将所有出现的字符串".jpg",".gif"或".png"
替换为".bmp"
sed -r
来进行扩展正则表达式。此时,该模式将匹配在egrep中使用的内容,并且您可能希望将其放入变量中以供重用。 - bukzorsed -i
,例如:sed -i''
,以便正确地进行原地更改。 - atripes另一种方法是这样做
find . -name *.xml -exec sed -i "s/4.6.0-SNAPSHOT/5.0.0-SNAPSHOT/" {} \;
关于上述命令的一些帮助
find 命令将在由 .
指示的当前目录中为你查找。
-name
参数可以使用通配符指定文件名,对我来说是 pom.xml。
-exec
执行操作。
sed
是流编辑器。
-i
忽略大小写。
s
用于替换。
/4.6.0.../
要搜索的字符串。
/5.0.0.../
要替换的字符串。
说实话,尽管我喜欢使用sed来处理合适的任务,但这明显是perl的任务--对于这种一行代码的任务,perl更加强大,特别是将其“写回到来源处”(perl的-i
开关可以为您完成此操作,并且还可以选择保留旧版本,例如附加了.bak的版本,只需使用-i.bak
即可)。
perl -i.bak -pe 's/\.jpg|\.png|\.gif/.jpg/
不要在sed中进行复杂的工作(如果可能的话),也不要使用awk...
sed
正则表达式选项。我认为我可能忘记了一些sed标志或者它有一些限制。 - meder omuraliev尝试使用for循环来做些什么
for i in `egrep -lR "YOURSEARCH" .` ; do echo $i; sed 's/f/k/' <$i >/tmp/`basename $i`; mv /tmp/`basename $i` $i; done
不太好看,但应该可以。
|while read i
模式可以启用流式传输,并避免当 egrep 的结果变得太长时出现长度限制。 - David Schmittfoo:/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
sed 's|foo:/Drive_letter:|foo:/ba/baz/xyz|g'
- Kevin