只有在当前行存在字符串替换(Replace only if string exists in cur

2019-07-30 23:24发布

我有一个线,如:

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

这个命令将所有改变mystringnewstring

我现在想的是:节目时看到mystring ,我怎么能检查当前行,如果该字符串searchstring存不存在? 如果它存在, newstring1 ; 否则, newstring0

Answer 1:

假设你的输入文件$目标包含以下内容:

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)的命令。

替换命令接受选择哪些线的取代应该发生一个可选的地址范围。

在这种情况下的正则表达式的地址被用来选择包含在第一命令的搜索字符串线; 并且不包含搜索字符串的行(注意正则表达式否定赛后感叹号)为第二个。

编辑

此命令将有更好的表现,并产生一样的结果:

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

的一点是,如果仍有在当前行一个MyString的子串之后的第一个命令完那么在它没有searchString的肯定命令被顺序并由此被执行。

荣誉给user946850。



Answer 2:

这是从的sed单行页:

优化速度:如果执行速度需要提高(由于大的输入文件或缓慢的处理器或硬盘),替换将被更迅速地执行,如果“发现”表达所赐的“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


文章来源: Replace only if string exists in current line
标签: linux shell sed