我发现了一种我无法用 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”。
为什么?因为 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 数字匹配。
与
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$