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