仅当字符串存在于当前行时才替换

And*_*ind 33 linux shell sed

我有一条线,如:

sed -i 's/mystring/newstring/' $target
Run Code Online (Sandbox Code Playgroud)

此命令将全部更改mystringnewstring.

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

Iho*_*nko 54

假设您的输入文件$ target包含以下内容:

some text mystring some other text
some text mystring a searchstring
just some more text
Run Code Online (Sandbox Code Playgroud)

这个命令:

sed -i -e '/searchstring/ s/mystring/1/ ; /searchstring/! s/mystring/0/' $target
Run Code Online (Sandbox Code Playgroud)

将其内容更改为:

some text 0 some other text
some text 1 a searchstring
just some more text
Run Code Online (Sandbox Code Playgroud)

说明

该脚本包含两个替代(小号由分号分隔)的命令.

substitute命令接受一个可选的地址范围,该范围选择应该进行替换的行.

在这种情况下,regexp地址用于为第一个命令选择包含searchstring的行; 和第二个不包含searchstring的行(注意regexp取消匹配后的感叹号).

编辑

此命令将更好地执行并产生相同的结果:

sed -i -e '/searchstring/ s/mystring/1/ ; s/mystring/0/' $target
Run Code Online (Sandbox Code Playgroud)

的一点是,如果仍有一个命令顺序,因此执行了mystring在当前行的子串之后的第一个命令完则没有searchString的在它是肯定的.

感谢用户946850.


krl*_*mlr 15

这是来自sed one-liners页面:

优化速度:如果需要增加执行速度(由于输入文件较大或处理器或硬盘较慢),如果在给出"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
Run Code Online (Sandbox Code Playgroud)

速度不是问题的问题,但语法提示有助于制定解决方案:

sed -i '/searchstring/ s/mystring/1/; s/mystring/0/' $target
Run Code Online (Sandbox Code Playgroud)