当我们尝试在 awk 中使用正则表达式修饰符时,最终会发生什么?

What ends up happening when we try to use regex modifiers in awk?

查看此输出:

❯ awk '/indubitably/i' /usr/share/dict/words | wc -l 
102401

Awk 不会抱怨无效的语法或类似的东西,只是吐出文件中的所有行(words 里面确实有 102401 个单词)。

因为作为一个 awk 新手尝试这个作为不区分大小写的猜测是非常合理的(我知道 IGNORECASE=1; 是正确的方法)我现在很好奇 awk 实际上如何解释 /indubitably/i.

实际上,该语法没有任何无效之处。

它是在每个输入行的任何地方匹配“indubitably”的正则表达式,并与一个未初始化的变量“i”连接,默认情况下,它是一个空字符串,或者布尔值 False。

但我猜测发生了什么,是 awk 将该空字符串连接到正则表达式(不是作为比较项,而是之后),它变成了 non-empty 字符串,因为你在正则表达式中有一个词。

以及基本上任何计算结果为 non-zero numerically or non-empty string becomes a boolean True at the pattern level 的东西,然后默认打印为一个动作。你真的可以在那里扔任何东西 -

写一个“1”只是常规符号,但你甚至可以放置NFOFMTFNRSUBSEPRS 就在模式处(只要它不是空字符串),它的工作方式就好像你在那里放置了一个“1”。