awk 中不区分大小写的搜索

Woe*_*itg 21 awk regular-expression

我需要使用 awk 搜索关键字,但我想执行不区分大小写(不区分大小写)的搜索。

我认为最好的方法是将搜索词(“关键字”)和 awk 同时阅读的目标行大写。从这个问题我如何使用toupper以全部大写打印,但我不知道如何在匹配中使用它,因为该答案仅显示打印并且不会将大写文本留在变量中。

这是一个例子,给定这个输入:

blablabla    
&&&Key Word&&&
I want all 
these text and numbers 123
and chars !"£$%&
as output
&&&KEY WORD&&&
blablabla
Run Code Online (Sandbox Code Playgroud)

我想要这个输出:

I want all 
these text and numbers 123
and chars !"£$%&
as output
Run Code Online (Sandbox Code Playgroud)

这是我所拥有的,但我不知道如何添加toupper

awk "BEGIN {p=0}; /&&&key word&&&/ { p = ! p ; next } ; p { print }" text.txt
Run Code Online (Sandbox Code Playgroud)

meu*_*euh 25

将您的表达式替换为/&&&key word&&&/使用$0当前行显式使用的另一个表达式来匹配模式(即):

tolower($0) ~ /&&&key word&&&/
Run Code Online (Sandbox Code Playgroud)

或者

toupper($0) ~ /&&&KEY WORD&&&/
Run Code Online (Sandbox Code Playgroud)

所以你有了

awk 'tolower($0) ~ /&&&key word&&&/ { p = ! p ; next }; p' text.txt
Run Code Online (Sandbox Code Playgroud)

您需要单引号,因为$0BEGIN 块可以删除,因为变量默认初始化为""0首次使用时,并且{print}是默认操作,如下面的评论中所述。

  • 请注意,您可以将其简化为 `awk 'toupper($0)~/&&&KEY WORD&&&/ { p = ! ; 下一个 } ; p;' 文本.txt`。不需要`BEGIN` 块,因为默认操作是打印,`p;` 就足够了。 (4认同)
  • 请注意:`tolower` 存在于古老的(或不那么古老的)awk 版本(例如:AIX)系统上,但 `toupper` 并不总是可用 ^^。 (2认同)

Wou*_*lst 18

gawk 有一个IGNORECASE内置变量,如果设置为非零,则会导致所有字符串和正则表达式比较不区分大小写。你可以这样使用:

BEGIN{IGNORECASE=1}
/&&&key word&&&/ { foo bar baz }
Run Code Online (Sandbox Code Playgroud)

等等。gawk不过,这是特定于 的,但我发现它比 meuh 的(更便携)替代方案更具可读性。当然,这是否有问题完全取决于您。

  • @Lizardx:这就是不扩展的重点:保持标准。否则,您只需创建另一个标准,然后它们之间就会出现一些不兼容(他们这样做,但尽量将标准更改保持在最低限度……即使如此,多重标准也是计算的主要问题之一) (4认同)
  • 我不同意。通过仔细执行,您可以在支持所有遗留方法的同时引入扩展,如果不这样做会发生什么,随着时间的推移,这些东西开始逐渐消失。计算中的一切都在进化,诀窍是保持非常稳定可靠的进化。Bash 是这样做的一个很好的例子,超级可靠并且只需添加新功能,它不是“两个标准”,而是使用支持的标准,一旦更改在全球范围内推出,您就可以开始使用新功能,因为只有最旧的遗留系统将没有支持。 (2认同)