为什么使用 awk 时 \d 不匹配数字?



我发现了一种我无法用awk来解释的行为。也许这是一个愚蠢的错误,但我无法弄清楚。

我有一个名为文件的文件,其中包含一些随机文件名。

$ 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$

我只想打印包含数字的文件名。我使用了以下命令:

awk '/d/{print $0}' files

但我的结果是:

$ awk '/d/{print $0}' files
3beds.txt
dedo
hello.mundo
helloWorld.txt

如果有人能向我解释为什么要打印这些行,我将不胜感激。谢谢!

提示:匹配的四行是包含"d"的四行。

因此,显然d被解释为字面上的"d"。

为什么?因为awk的正则表达式语法是POSIX Extended Regular Expressions的,而不是你可能习惯的PerlPCREEcma。因此d并不代表您所期望的"数字"。您最终使用反斜杠转义来强制使用文字"d"。

awk 中d的等效项取决于您想要的语义[1]。[0-9]将仅匹配十个 ASCII 数字。您还可以在 POSIX 括号表达式中使用 POSIX 字符类作为数字,[[:digit:]]

当用于具有非 ASCII 字符的字符串时,[:d igit:] 类可能包含其他脚本中的数字,具体取决于区域设置。

我的引文来自 regular-expressions.info,它有很多关于许多语法的信息。该页面从该页面获取信息并将其转换为一个方便的表格,非常详细地比较了其中的 15 个。


[1]:即使对于支持速记d的正则表达式引擎,语义也可能有所不同:

由于某些字符类经常使用,因此可以使用一系列速记字符类。\d 是 [0-9] 的缩写。在大多数支持 Unicode 的风格中,\d 包含所有脚本中的所有数字。值得注意的例外是Java,JavaScript和PCRE。这些 Unicode 风格仅将 ASCII 数字与 \d 匹配。

awk,如果你want to print only the lines containing digits,你可以改用这个正则表达式:

awk '/[[:digit:]]/' file
3beds.txt$
file4.txt$
file3.txt$
file5.txt$
texto5.txt$
34lions$
texto2.txt$
file1.txt$
7hello$
texto3$
texto4$
file2.txt$

最新更新