考虑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