仅当字符串存在于当前行时才替换

时间:2012-08-14 18:18:32

标签: linux shell sed

我有一行如:

sed -i 's/mystring/newstring/' $target

此命令会将所有mystring更改为newstring

我现在想要的是:当程序看到mystring时,如果字符串searchstring存在与否,我如何检查当前行?如果存在,则newstring1;否则,newstring0

2 个答案:

答案 0 :(得分:50)

解决方案

假设您的输入文件$ target包含以下内容:

some text mystring some other text
some text mystring a searchstring
just some more text

此命令:

sed -i -e '/searchstring/ s/mystring/1/ ; /searchstring/! s/mystring/0/' $target

将其内容更改为:

some text 0 some other text
some text 1 a searchstring
just some more text

说明

该脚本包含两个以分号分隔的替换( s )命令。

substitute命令接受一个可选的地址范围,用于选择替换应该发生的行。

在这种情况下, regexp 地址用于为第一个命令选择包含 searchstring 的行;和第二个不包含 searchstring 的行(请注意正则表达式取消匹配后的感叹号)。

修改

此命令将表现更好并产生相同的结果:

sed -i -e '/searchstring/ s/mystring/1/ ; s/mystring/0/' $target

重点是命令是按顺序执行的,因此如果在第一个命令完成后当前行中仍然存在 mystring 子字符串,那么就没有其中搜索字符串肯定。

感谢用户946850。

答案 1 :(得分:15)

这是来自sed one-liners页面:

  

优化速度:如果需要提高执行速度(由于   大输入文件或慢速处理器或硬盘),替换将   如果之前指定了“find”表达式,则执行得更快   给出“s /.../.../”指令。因此:

sed 's/foo/bar/g' filename         # standard replace command
sed '/foo/ s/foo/bar/g' filename   # executes more quickly
sed '/foo/ s//bar/g' filename      # shorthand sed syntax

速度不是问题的问题,但语法提示有助于制定解决方案:

sed -i '/searchstring/ s/mystring/1/; s/mystring/0/' $target