awk 中不区分大小写的搜索

awk 中不区分大小写的搜索

我需要使用 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 的(更便携)替代方案更具可读性。当然,这是否是一个问题完全取决于您。

相关内容