我想将一些sed命令应用于一系列行。范围由起始正则表达式和结束正则表达式定义。有没有办法在第二个使用第一个正则表达式的子表达式?范围的起始行和结束行必须具有相同数量的前导标签的示例:
sed -r '/^(\t*)FOO$/,/^\1BAR$/d' file
当然,这个例子不起作用。
答案 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
会停止当前命令并使用下一行重新启动所有命令循环。