40

我有一条线,例如:

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

此命令将全部更改mystringnewstring.

我现在想要的是:当程序看到时,如果字符串存在与否mystring,我如何检查当前行?searchstring如果存在,newstring1;否则,newstring0

4

2 回答 2

68

解决方案

假设您的输入文件 $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。

于 2012-08-14T18:32:30.143 回答
18

这是来自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
于 2012-08-14T18:34:10.773 回答