我发现了一种我无法用 awk 真正解释的行为。也许这是一个愚蠢的错误,但我无法弄清楚。
我有一个名为 files 的文件,其中有一些随机文件名。
$ cat -e files
3beds.txt$
file4.txt$
file3.txt$
dedo$
file5.txt$
texto5.txt$
metoo.txt$
34lions$
texto2.txt$
file1.txt$
7hello$
summer$
missing$
hello.mundo$
helloWorld.txt$
texto3$
awkvars$
texto4$
yes$
file2.txt$
Run Code Online (Sandbox Code Playgroud)
我只想打印包含数字的文件名。我使用了命令:
awk '/\d/{print $0}' files
Run Code Online (Sandbox Code Playgroud)
但我的结果是:
$ awk '/\d/{print $0}' files
3beds.txt
dedo
hello.mundo
helloWorld.txt
Run Code Online (Sandbox Code Playgroud)
如果有人能向我解释为什么要打印这些行,我将非常感激。谢谢你!
因此,显然\d被解释为字面的“d”。
为什么?因为 awk 的正则表达式语法是POSIX Extended Regular Expressions,而不是Perl,PCRE或者Ecma您可能已经习惯了。所以\d并不像您所期望的那样代表“数字”。您最终使用反斜杠转义来强制使用文字“d”。
awk 中的等效项\d取决于您想要的语义[1]。[0-9]将仅匹配十个 ASCII 数字。您还可以在 POSIX 括号表达式 , 中使用 POSIX 字符类作为[[:digit:]]数字:
当用于包含非 ASCII 字符的字符串时,[:digit:] 类可能包含其他脚本中的数字,具体取决于区域设置。
我的引文来自regular-expressions.info,其中包含有关许多语法的丰富信息。此页面从该页面获取信息,并将其转换为一个方便的表格,详细比较了其中的 15 个。
[1]:即使对于支持简写的正则表达式引擎\d,语义也可能不同:
由于经常使用某些字符类,因此可以使用一系列速记字符类。\d 是 [0-9] 的缩写。在大多数支持 Unicode 的风格中,\d 包括所有脚本中的所有数字。值得注意的例外是 Java、JavaScript 和 PCRE。这些 Unicode 风格仅与带有 \d 的 ASCII 数字匹配。