Woe*_*itg 2 awk regular-expression
考虑一下text.txt
这个内容:
blablabla
&&&key word&&&
I want all
these text and numbers 123
and chars !"£$%&
as output
&&&key word&&&
blablabla
Run Code Online (Sandbox Code Playgroud)
我想实现一个正则表达式,用awk
它获得以下输出:
I want all
these text and numbers 123
and chars !"£$%&
as output
Run Code Online (Sandbox Code Playgroud)
我正在使用这个表达式:
awk "$1 ~ /^[&&&key word&&&].[&&&key word&&&]/" test.txt
Run Code Online (Sandbox Code Playgroud)
但结果不是我所期望的:
&&&key word&&&
&&&key word&&&
Run Code Online (Sandbox Code Playgroud)
我道歉,因为这可能不是一个好问题。我已经从这里和 stackoverflow 尝试了很多解决方案,我阅读了一些教程,但仍然无法解决。如果你也能给我一个关于这个主题的完整教程,我将不胜感激。
编辑:按照建议使用 $0,我得到了更好的结果:
awk "$0 ~ /[&&&key word&&&]/,/[&&&key word&&&]/" test.txt
Run Code Online (Sandbox Code Playgroud)
结果是:
&&&key word&&&
I want all
these text and numbers 123
and chars !"£$%&
as result
&&&key word&&&
Run Code Online (Sandbox Code Playgroud)
我仍然需要删除第一行和最后一行,我知道条件是否符合awk "{if (NR!=1&&NR!=-1) {print}}" text.txt
但我不知道如何将其应用于上述输出
awk 'BEGIN {p=0}; /&&&key word&&&/ { p = ! p ; next } ; p { print }' file
Run Code Online (Sandbox Code Playgroud)
这仅打印 的两个匹配实例之间的行&&&key word&&&
。该变量p
用作决定是否打印的标志......它开始为假(不打印)并且每次&&&key word&&&
在输入行上匹配时逻辑否定(反转)。
如果有多个输入行块,&&&key word&&&
则将打印所有这些块(但没有其他块)。如果有开头&&&key word&&&
但没有结尾与之匹配,则将打印文件末尾的所有后续行。
输出:
I want all
these text and numbers 123
and chars !"£$%&
as output
Run Code Online (Sandbox Code Playgroud)
如果开始和结束关键字不同(例如“START”和“STOP”),您可能更想做这样的事情:
awk 'BEGIN {p=0};
/START/ { p = 1 ; next };
/STOP/ { p = 0 ; next};
p { print }' file
Run Code Online (Sandbox Code Playgroud)