awk:在下一个模式之前和之后匹配模式和打印行

时间:2015-01-21 17:38:53

标签: awk

使用awk: 找一个模式。 在该模式之后打印所有行直到下一个模式。 在该模式之前打印所有行直到下一个模式。

例如。如果这是文件的内容

?hello@
line-0
?type=A;so on
line-1
short-description
line-2
line-3
ending@
line-4
?bye@

匹配模式short-description并在模式@之后打印行并在模式?之前打印行,因此输出应为:

?type=A;so on
line-1
short-description
line-2
line-3
ending@

我尝试过:awk' / short-description / {copy = 1; next} / @ / {copy = 0; next} copy'文件

但我不知道如何获得之前的模式部分,我对awk的知识非常有限。另外请提供一个单行解决方案。

请帮忙。非常感谢。

1 个答案:

答案 0 :(得分:1)

尝试:

/^\?/ { delete arr ; len = 0 ; hit = 0 }
/^\?/,/@$/ {
    arr[len++] = $0
    if ( /short-description/ )
      hit = 1
}
/@$/ {
    if(hit)
      for(i=0;i<len;++i)
        print arr[i]
}

或者,这个单行:

BEGIN { RS="?" } /short-description/ { sub("@.*","") ; print $0 }