我正在使用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用作记录分隔符.这一点很重要,以匹配-Z的egrep,并避免在输入文件名空格和换行被愚弄.
-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 ......
小智 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.../ 要替换的字符串
我无法让这个页面上的任何命令为我工作: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_regex为replacement_string以.h或结尾的任何文件.m.
我过去也曾为此目的使用过rpl.
| 归档时间: |
|
| 查看次数: |
118788 次 |
| 最近记录: |