gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:06:53 25 4
gpt4 key购买 nike

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

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

最佳答案

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

因此,显然 \d 被解释为文字“d”。

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

awk 中 \d 的等价物取决于您想要的语义[1]。 [0-9] 将仅匹配十个 ASCII 数字。您也可以使用 POSIX character class for digit inside a POSIX Bracket Expression , [[:digit:]]:

When used on strings with non-ASCII characters, the [:digit:] class may include digits in other scripts, depending on the locale.

我的报价来自 regular-expressions.info ,其中包含有关许多语法的丰富信息。 This page从该页面获取信息并将其转换为一个方便的表格,详细比较其中的 15 个。


[1]:即使对于支持简写 \d 的正则表达式引擎,语义也可能不同:

Since certain character classes are used often, a series of shorthand character classes are available. \d is short for [0-9]. In most flavors that support Unicode, \d includes all digits from all scripts. Notable exceptions are Java, JavaScript, and PCRE. These Unicode flavors match only ASCII digits with \d.

关于regex - 为什么在使用 awk 时\d 不匹配数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68292978/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com