我有一个行如:
sed -i 's/mystring/newstring/' $target
这个命令会把所有的mystring
newstring
。
我现在想要的是:当程序看到mystring
,如果stringsearchstring
存在或不存在,如何检查当前行? 如果存在, 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 )命令。
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