ls -l 与正则 grep 表达式

ls -l 与正则 grep 表达式

我们有以下 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

但是当我尝试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

我哪里错了?

答案1

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

相关内容