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)
我错在哪里?
初步说明:使用基本正则表达式(默认)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
归档时间: |
|
查看次数: |
159 次 |
最近记录: |