多行 awk 正则表达式

多行 awk 正则表达式

考虑text.txt以下内容:

blablabla    
&&&key word&&&
I want all 
these text and numbers 123
and chars !"£$%&
as output
&&&key word&&&
blablabla

我想实现一个正则表达式,用awk它获得以下输出:

I want all 
these text and numbers 123
and chars !"£$%&
as output

我正在使用这个表达:

awk "$1 ~ /^[&&&key word&&&].[&&&key word&&&]/" test.txt

但结果不是我所期望的:

&&&key word&&&
&&&key word&&&

我很抱歉,因为也许这不是一个好问题。我已经从这里和 stackoverflow 尝试了许多解决方案,我阅读了一些教程,但仍然无法解决它。如果您也能给我一个关于这个主题的完整教程,我将非常感激。

编辑:按照建议使用 $0,我得到更好的结果:

awk "$0 ~ /[&&&key word&&&]/,/[&&&key word&&&]/" test.txt

结果是:

&&&key word&&&
I want all 
these text and numbers 123
and chars !"£$%&
as result
&&&key word&&&

我仍然需要删除第一行和最后一行,我知道条件是否相似awk "{if (NR!=1&&NR!=-1) {print}}" text.txt,但我不知道如何将其应用于上面的输出

答案1

awk 'BEGIN {p=0}; /&&&key word&&&/ { p = ! p ; next } ; p { print }' file

这仅打印 的两个匹配实例之间的行&&&key word&&&。该变量p用作决定是否打印的标志......它以 false(不打印)开始,并且每次&&&key word&&&在输入行上匹配时都在逻辑上取反(反转)。

如果存在多个输入行块,&&&key word&&&则将打印所有此类块(但不打印其他块)。如果有开头&&&key word&&&但没有结尾与之匹配,则将打印文件末尾的所有后续行。

输出:

I want all 
these text and numbers 123
and chars !"£$%&
as output

如果开始和结束关键字不同(例如“START”和“STOP”),您可能想要执行类似这样的操作:

awk 'BEGIN {p=0};
     /START/ { p = 1 ; next };
     /STOP/ { p = 0 ; next};
     p { print }' file

相关内容