仅在当前行中存在string时才进行replace

我有一个行如:

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

这个命令会把所有的mystring newstring

我现在想要的是:当程序看到mystring ,如果stringsearchstring存在或不存在,如何检查当前行? 如果存在, newstring1 ; 否则, newstring0

假设你的输入文件$ 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命令接受一个可选的地址范围,用来选择替换应该发生的行。

在这种情况下,使用正则表达式地址来选择包含第一个命令的搜索字符串的行; 和不包含搜索字符串的行 (注意在正则表达式否定匹配之后的感叹号)。

编辑

这个命令会执行得更好,并产生相同的结果:

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

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

荣誉为user946850。

这是从sed单行页面:

优化速度:如果需要增加执行速度(由于输入文件太大或处理器或硬盘速度较慢),如果在给定“s /…/”之前指定了“find”表达式,替换将会更快地执行。 ../“指令。 从而:

 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