我想执行sed
的匹配任何命令行的任一and
或or
多个命令:例如,sed '50,70/abc/d'
将删除范围内的所有行50,70
匹配/abc/
,还是有办法做sed -e '10,20s/complicated/regex/' -e '30,40s/complicated/regex/
,而无需重新输入s/compicated/regex/
Joh*_*024 10
该and
部分可以用大括号完成:
sed '50,70{/abc/d;}'
Run Code Online (Sandbox Code Playgroud)
此外,可以针对多种and
条件嵌套大括号.
(以上是在GNU下进行测试的sed
.BSD sed
在细节方面可能有所不同,但细节却令人沮丧.)
该or
部分可以通过分支处理:
sed -e '10,20{b cr;}' -e '30,40{b cr;}' -e b -e :cr -e 's/complicated/regex/' file
Run Code Online (Sandbox Code Playgroud)
10,20{b cr;}
对于从10到20的所有行,我们分支到标签 cr
30,40{b cr;}
对于从30到40的所有行,我们分支到标签 cr
b
对于所有其他行,我们跳过其余的命令.
:cr
这标志着标签 cr
s/complicated/regex/
这在分支的行上执行替换cr
.
使用GNU sed
,上面的语法可以缩短为:
sed '10,20{b cr}; 30,40{b cr}; b; :cr; s/complicated/regex/' file
Run Code Online (Sandbox Code Playgroud)