如果字符串在sed中的行中创建,则在两个正则表达式之间打印行

时间:2014-05-09 14:53:13

标签: sed

similar this question

我有这个文件

START1
1
2
END1
START2
error
1
2
END2
START3
1
2
END3

我希望error找到; sed提取整件并打印出来

例如out put是

START2
error
1
2
END2

因为在errorSTART2

之间找到了END2

如何仅使用sed解决问题?!?

2 个答案:

答案 0 :(得分:2)

使用sed

sed -n ':a;/START/,/END/{/END/!{$!{N;ba;}};/error/p;}' inputfile

我们的想法是在两个指定地址之间的模式空间中添加行。如果找到正则表达式(在这种情况下为字符串error),则打印该块。除非明确指定,否则-n不会打印任何内容。

对于您的样本输入,它会产生:

START2
error
1
2
END2

答案 1 :(得分:2)

Perl解决方案:

perl -ne '
   $inside = 1 if /START/;
   push @lines, $_ if $inside;
   $error = 1 if /error/ and $inside;
   if (/END/) {
       print @lines if $error;
       undef @lines;
       $inside = 0;
       $error = 0;
   }
' file