awk:匹配图案并在前后打印线条,直到下一个图案

awk:匹配图案并在前后打印线条,直到下一个图案,awk,Awk,使用awk: 找到一个模式。 打印该图案之后的所有线条,直到下一个图案。 打印该图案之前的所有行,直到下一个图案 如果这是文件的内容 ?hello@ line-0 ?type=A;so on line-1 short-description line-2 line-3 ending@ line-4 ?bye@ 匹配模式简短描述并在till模式@后打印行,在till模式前打印行?,因此输出应为: ?type=A;so on line-1 short-description line-2 line

使用awk: 找到一个模式。 打印该图案之后的所有线条,直到下一个图案。 打印该图案之前的所有行,直到下一个图案

如果这是文件的内容

?hello@
line-0
?type=A;so on
line-1
short-description
line-2
line-3
ending@
line-4
?bye@
匹配模式
简短描述
并在till模式
@
后打印行,在till模式
前打印行?
,因此输出应为:

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

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

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

请帮忙。非常感谢。

试试:

/^\?/ { 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]
}

你试过什么?Good luck.awk'/short description/{copy=1;next}/@/{copy=0;next}copy'文件但我不知道如何在模式之前获取它编辑问题以添加您尝试的内容请提供一行程序解决方案。很抱歉,我对awk了解不多。好的,我试过了:awk开始{RS=“?”}/short description/{sub(@.*”,“”);打印$0}文件。但它给了我这个错误:-bash:意外标记附近的语法错误`('如果您还没有这样做,您必须用单引号将整个awk脚本括起来,以将脚本作为单个命令行参数传递到awk中。然后,要处理的每个文件都是awk的另一个参数。是的,我也尝试过,但它只打印整个文件:awk'BEGIN{RS=“?”}/short description/{sub(@.*,“”);print$0}'FileName.xmlHrm,不确定是什么问题。您可以用
nawk
gawk
替换
awk
吗?看起来您正在使用
bash
,所以单引号应该可以。
BEGIN { RS="?" } /short-description/ { sub("@.*","") ; print $0 }