awk:匹配模式并在下一个模式之前和之前打印行
awk: match pattern and print lines after and before till next pattern
使用 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} 复制'文件
但我不知道如何获取之前的模式部分,我对 awk 的了解非常有限。也请提供一个在线解决方案。
请帮忙。非常感谢。
尝试:
/^\?/ { delete arr ; len = 0 ; hit = 0 }
/^\?/,/@$/ {
arr[len++] = [=10=]
if ( /short-description/ )
hit = 1
}
/@$/ {
if(hit)
for(i=0;i<len;++i)
print arr[i]
}
或者,这一行:
BEGIN { RS="?" } /short-description/ { sub("@.*","") ; print [=11=] }
使用 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} 复制'文件
但我不知道如何获取之前的模式部分,我对 awk 的了解非常有限。也请提供一个在线解决方案。
请帮忙。非常感谢。
尝试:
/^\?/ { delete arr ; len = 0 ; hit = 0 }
/^\?/,/@$/ {
arr[len++] = [=10=]
if ( /short-description/ )
hit = 1
}
/@$/ {
if(hit)
for(i=0;i<len;++i)
print arr[i]
}
或者,这一行:
BEGIN { RS="?" } /short-description/ { sub("@.*","") ; print [=11=] }