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

问题描述 投票:0回答:2

我发现了一种我无法用 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$

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

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

但我的结果是:

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

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

regex awk
2个回答
9
投票

线索:匹配的四行是包含“d”的四行。

所以,显然

\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 数字匹配。


0
投票

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$
© www.soinside.com 2019 - 2024. All rights reserved.