在awk中不区分大小写的搜索


20

我需要使用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

Answers:


23

/&&&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}是默认操作,如以下注释中所述。


4
请注意,您可以将其简化为awk 'toupper($0)~/&&&KEY WORD&&&/ { p = ! p ; next } ; p;' text.txt。不需要该BEGIN块,并且由于默认操作是打印,因此p;就足够了。
terdon

1
“没有必要BEGIN块”,因为未初始化的变量的值为假。
glenn jackman '16

感谢您的优化。我通常会尽量限制对原始内容的最小更改,但是确实,新结果要紧凑得多且可读性强。
meuh's

2
只是一个提示:tolower在古老的(或不太古老)的awk版本(例如:AIX)系统中存在,但toupper并非始终可用^^。
奥利维尔·杜拉克

16

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

BEGIN{IGNORECASE=1}
/&&&key word&&&/ { foo bar baz }

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


1
我一直想在我最大的gawk项目之一中支持awk多年,但是由于缺少区分大小写的搜索内容,gawk的缺乏区分大小写的搜索触发了gawk使其无法使用。gensub是aawk中另一个难以替代的功能。但是gawk并非总是默认安装在某些机器和发行版上,尽管它几乎总是可用的,但是不幸的是,到2016年,它们无法更改awk和posix来稍微扩展这种标准工具的功能。
Lizardx '16

3
@Lizardx:这就是不扩展的全部要点:保持标准。否则,您只是创建另一个标准,然后它们之间会存在一些不兼容(它们可以这样做,但是要尽量减少对标准的更改……即使那样,多个标准也是计算的主要难题之一)
Olivier Dulac

2
我不同意 通过谨慎执行,您可以在支持所有传统方法的同时引入扩展,如果您不这样做,将会发生事情,随着时间的流逝,这些东西开始逐渐消失。计算中的一切都在发展,诀窍是保持非常稳定可靠的发展。Bash是做到这一点的一个很好的例子,它超级可靠,只需添加新功能,就不那么“两个标准”,使用支持的功能,并且在全球范围内实施更改后,您就可以开始使用新功能,因为只有最旧的遗留系统将不受支持。
Lizardx '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.