我有一行如:
sed -i 's/mystring/newstring/' $target
此命令会将所有mystring
更改为newstring
。
我现在想要的是:当程序看到mystring
时,如果字符串searchstring
存在与否,我如何检查当前行?如果存在,则newstring
为1
;否则,newstring
为0
。
答案 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