当我们尝试在 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
”只是常规符号,但你甚至可以放置NF
、OFMT
、FNR
、SUBSEP
或RS
就在模式处(只要它不是空字符串),它的工作方式就好像你在那里放置了一个“1
”。
查看此输出:
❯ 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
”只是常规符号,但你甚至可以放置NF
、OFMT
、FNR
、SUBSEP
或RS
就在模式处(只要它不是空字符串),它的工作方式就好像你在那里放置了一个“1
”。