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

时间:2015-03-03 06:29:57

标签: command-line sed

我想为与多个命令的sedand匹配的任何行执行一些or命令:例如,sed '50,70/abc/d'将删除范围中的所有行{匹配50,70的{​​1}},或无法重新输入/abc/的{​​{1}} {/ 1}}

4 个答案:

答案 0 :(得分:10)

逻辑和

and部分可以用大括号完成:

sed '50,70{/abc/d;}'

此外,大括号可以嵌套多个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
  • 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

答案 1 :(得分:3)

要删除10到20和30到40之间的行,将复杂的正则表达式与GNU sed匹配:

sed -e '10,20bA;30,40bA;b;:A;s/complicated/regex/;d' file

或:

sed -e '10,20bA' -e '30,40bA' -e 'b;:A;s/complicated/regex/;d' file

<小时/> bA:跳转到标签:A

b:没有标签的跳转 - &gt;跳到脚本结尾

d:删除行

答案 2 :(得分:1)

我不认为sed具有多个选择标准的便利,我的建议是升级到awk,你可以在那里做类似的事情:

awk 'NR >= 50 && NR <= 70 && /abc/ {next} {print}' inputFile
awk '(NR >= 10 and NR <= 20) || (NR >= 30 && NR <= 40) {
     sub("from-regex", "to-string", $0); print }'

答案 3 :(得分:0)

sed非常适合单个行上的简单替换,但对于其他任何东西,只需使用awk以获得清晰度,健壮性,可移植性,可维护性等等。

awk '
(NR>=50 && NR<=70) && /abc/ { next }
(NR>=10 && NR<=20) || (NR>=30 && NR<=40) { sub(/complicated/,"regex") }
{ print }
' file