我需要使用 awk 搜索关键字,但我想执行不区分大小写(不区分大小写)的搜索。
我认为最好的方法是将搜索词(“关键字”)和 awk 同时读取的目标行大写。从这个问题我如何使用toupper
以全大写形式打印,但我不知道如何在匹配中使用它,因为该答案仅显示打印并且不会将大写文本留在变量中。
这是一个示例,给出了以下输入:
blablabla
&&&Key Word&&&
I want all
these text and numbers 123
and chars !"£$%&
as output
&&&KEY WORD&&&
blablabla
我想要这个输出:
I want all
these text and numbers 123
and chars !"£$%&
as output
这是我所拥有的,但我不知道如何添加toupper
:
awk "BEGIN {p=0}; /&&&key word&&&/ { p = ! p ; next } ; p { print }" text.txt
答案1
将您的表达式替换为显式使用当前行的/&&&key word&&&/
另一个表达式来匹配模式(即):$0
tolower($0) ~ /&&&key word&&&/
或者
toupper($0) ~ /&&&KEY WORD&&&/
所以你有了
awk 'tolower($0) ~ /&&&key word&&&/ { p = ! p ; next }; p' text.txt
您需要单引号,因为$0
, BEGIN 块可以被删除,因为变量默认初始化为""
或0
第一次使用,并且{print}
是默认操作,如下面的注释中所述。
答案2
gawk 有一个IGNORECASE
内置变量,如果将其设置为非零,则会导致所有字符串和正则表达式比较不区分大小写。你可以用它:
BEGIN{IGNORECASE=1}
/&&&key word&&&/ { foo bar baz }
虽然这是特定于 的gawk
,但我发现它比 meuh 的(更便携)替代方案更具可读性。当然,这是否是一个问题完全取决于您。