如何匹配sed中的多个地址?

iob*_*der 6 command-line sed

我想执行sed的匹配任何命令行的任一andor多个命令:例如,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)