我有一条线,例如:
sed -i 's/mystring/newstring/' $target
此命令将全部更改mystring
为newstring
.
我现在想要的是:当程序看到时,如果字符串存在与否mystring
,我如何检查当前行?searchstring
如果存在,newstring
是1
;否则,newstring
是0
。
假设您的输入文件 $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 ) 命令。
替换命令接受一个可选的地址范围,用于选择应该进行哪些行的替换。
在这种情况下,正则表达式地址用于选择包含第一个命令的搜索字符串的行;以及第二个不包含搜索字符串的行(注意正则表达式否定匹配后的感叹号)。
此命令将执行得更好并产生相同的结果:
sed -i -e '/searchstring/ s/mystring/1/ ; s/mystring/0/' $target
关键是命令是按顺序执行的,因此如果在第一个命令完成后当前行中仍有一个mystring子字符串,那么其中肯定没有搜索字符串。
感谢 user946850。
这是来自sed one-liners页面:
优化速度:如果需要提高执行速度(由于输入文件大或处理器或硬盘速度慢),如果在给出“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