我正在使用egrep -R
紧随其后的包含大约10个并集的正则表达式,例如:
.jpg | .png | .gif
etc。这很好用,现在我想将所有找到的字符串替换为.bmp
我在想类似的东西
egrep -lR "\.jpg|\.png|\.gif" . | sed "s/some_expression/.jpg/" file_it_came_form
因此,这里的问题是如何在其中执行类似的联合正则表达式,sed
以及如何告诉它将更改保存到从中获取输入的文件中。
我正在使用egrep -R
紧随其后的包含大约10个并集的正则表达式,例如:
.jpg | .png | .gif
etc。这很好用,现在我想将所有找到的字符串替换为.bmp
我在想类似的东西
egrep -lR "\.jpg|\.png|\.gif" . | sed "s/some_expression/.jpg/" file_it_came_form
因此,这里的问题是如何在其中执行类似的联合正则表达式,sed
以及如何告诉它将更改保存到从中获取输入的文件中。
Answers:
使用此命令:
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
of egrep
以及避免被输入文件名中的空格和换行符所迷惑很重要。
-l
:每个命令使用一行作为参数
sed
:在小号 tream 编 itor
-i
:用输出替换输入文件而不进行备份
-e
:使用以下参数作为表达式
's/\.jpg\|\.gif\|\.png/.bmp/g'
:替换字符串的所有匹配".jpg"
,".gif"
或".png"
与".bmp"
sed -r
用于扩展正则表达式。届时,该模式将与egrep中使用的模式匹配,您可能需要将其放入变量中以供重用。
老实说,就像我喜欢为完成适当的任务而完成的工作一样,这绝对是perl的任务-对于这种单行代码,它确实更强大,尤其是“将其写回到其来源”(perl的-i
开关可以完成此任务)您,并且还可以选择保留旧版本,例如,附加.bak,只需改用-i.bak
。
perl -i.bak -pe 's/\.jpg|\.png|\.gif/.jpg/
而不是在sed(甚至可能的话)或awk中进行复杂的工作...
sed
..我想我要么忘记了一些sed标志,要么它有局限性。
另一种方式
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.../
要替换的字符串
尝试使用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的结果变得太长时避免长度限制
我的用例是我想替换为
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'
希望能有所帮助。
更新s | foo:/ Drive_letter:| foo:/ ba / baz / xyz | g
sed 's|foo:/Drive_letter:|foo:/ba/baz/xyz|g'