ls -l 带有正则 grep 表达式

yae*_*ael 2 grep bash shell-script regular-expression

我们有以下 1000 个文件

ls -ltr | grep list_of_cars | sort

-rw-r--r-- 1 root root   259 Dec 24 16:29 list_of_cars-0.json
-rw-r--r-- 1 root root   259 Dec 24 16:29 list_of_cars-1.json
-rw-r--r-- 1 root root   259 Dec 24 16:29 list_of_cars-2.json
.
.
.

-rw-r--r-- 1 root root   260 Dec 24 16:29 list_of_cars-996.json
-rw-r--r-- 1 root root   260 Dec 24 16:29 list_of_cars-997.json
-rw-r--r-- 1 root root   260 Dec 24 16:29 list_of_cars-998.json
-rw-r--r-- 1 root root   260 Dec 24 16:29 list_of_cars-999.json
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用list_of_cars-[0-999].json以下常规语法捕获所有文件时,我们只得到 10 个文件而不是 1000 个,为什么?

ls -ltr | sort | awk '{print $NF}' | grep "^list_of_cars-[0-999].json"
list_of_cars-0.json
list_of_cars-1.json
list_of_cars-2.json
list_of_cars-3.json
list_of_cars-4.json
list_of_cars-5.json
list_of_cars-6.json
list_of_cars-7.json
list_of_cars-8.json
list_of_cars-9.json
Run Code Online (Sandbox Code Playgroud)

我错在哪里?

Zei*_*tor 7

初步说明:使用基本正则表达式(默认)grep强制反斜杠转义相当多的元字符(请参阅grep手册页中的“基本与扩展正则表达式” )。我在下面的示例中避免了这些额外的转义,因此您应该将它们用作扩展的正则表达式 with grep -E <regexp>(或自己转义相关的元字符)。


在正则表达式中[0-999]表示“匹配 0-9 或 9 或 9 范围内的一个字符”

您正在寻找的是(我将首先选择最简单的)“匹配 0-9 范围内的任意数量的字符”,这将转换为[0-9]*.

还要注意.匹配任何字符。要完全匹配一个句点,您必须将该值转义为\.

所以你最终的正则表达式将是 ^list_of_cars-[0-9]*\.json

现在,这将匹配 0 个或多个数字,因此list_of_cars-.json将匹配。我们可以通过询问“匹配 0-9 范围内的一个或多个字符”来限制一个步骤,这将是^list_of_cars-[0-9]+\.json

如果你真的想确保你不会得到超过 999 的结果,我们可以通过指定“匹配 0-9 范围内的 1 到 3 个字符”来更加严格=> ^list_of_cars-[0-9]{1,3}\.json