GNU sed:在第二个地址regexp中使用第一个地址regexp的子表达式

时间:2015-08-24 13:34:12

标签: regex sed

我想将一些sed命令应用于一系列行。范围由起始正则表达式和结束正则表达式定义。有没有办法在第二个使用第一个正则表达式的子表达式?范围的起始行和结束行必须具有相同数量的前导标签的示例:

sed -r '/^(\t*)FOO$/,/^\1BAR$/d' file

当然,这个例子不起作用。

1 个答案:

答案 0 :(得分:1)

否则您无法对另一个模式中的组使用反向引用。 (换句话说,每个模式都有自己的组。)

您可以做的是在模式空间中逐行附加行,直到模式匹配。

sed -r '/^\t*FOO$/{:a;N;/^(\t*)FOO(\n.*)*\n\1BAR$/d;ba;};' file

细节:

/^\t*FOO$/ { # when the first line of the block is found:
    :a;  # define the label "a"
    N;   # append the next line to the pattern space
    /^(\t*)FOO(\n.*)*\n\1BAR$/d; # delete lines from pattern space
                                 # when the pattern matches
    ba;  # go to the label "a"
};

请注意,d会停止当前命令并使用下一行重新启动所有命令循环。