我正在学习 bash 的基础知识,但遇到了麻烦。当我尝试列出来自 dev 的以一位或两位数字结尾的文件时,我永久得到“没有这样的文件或目录”。
ls /dev | grep ^.*[0-9]{1,2}$
ls /dev | grep -E ^.*[0-9]{1,2}$
ls /dev | egrep ^.*[0-9]{1,2}$
ls /dev | grep ^.*\[0-9\]\{1,2\}$
所有这些命令都以相同的响应结束。我做错了什么?
最佳答案
试试这个:
find /dev -maxdepth 1 -regex '.*[0-9]'
我们在这里使用find
,因为一般来说,永远不要 parse the output of ls .
find/dev -maxdepth 1
找到 /dev
中的所有文件(但我们阻止它搜索 /dev
的子目录) .
-regex '.*[0-9]'
将 find
的输出限制为名称(不包括任何目录)与正则表达式 匹配的文件.*[0-9]
。不需要锚定正则表达式以匹配文件名的从头到尾:这是查找的默认行为。
默认情况下,find
使用 emacs 风格的正则表达式。 GNU find
可以选择使用 -regextype
,使用其他四种正则表达式样式之一:posix-awk、posix-basic、posix-egrep 和 posix-extended。有关详细信息,请参见 man find
。
请注意,因为 .
匹配其他字符中的数字,所以正则表达式 .*[0-9]{1,2}
匹配 1 个或任意数量的更多数字在最后。这使得它等同于 .*[0-9]
简化:
正如本杰明在评论中提到的,这非常简单,不需要 regex。使用 glob 代替:
find /dev -maxdepth 1 -name '*[0-9]'
拒绝名称以三位或更多数字结尾的文件
这将找到其名称至少有一个非数字字符并以一或两个但不能更多的数字结尾的文件:
find /dev -maxdepth 1 -regextype posix-egrep -regex '.*[^[:digit:]][[:digit:]]{1,2}'
如果您只想在屏幕上显示文件名但不想将它们作为管道的一部分进行解析,那么以下内容可能就足够了。这将找到名称至少包含三个字符并以一或两位但不多于数字结尾的文件:
ls /dev/*[^[:digit:]]?[[:digit:]]
这个 ls
解决方案确实有一个障碍:它会拒绝像 a1b2
这样的文件名,即使它以一位数字结尾。由于 /dev
通常没有那种命名风格,这可能不是什么大问题。
在上述两种方法中,我使用了 [:digit:]
因为它是 unicode 安全的。如果您所在的语言环境无关紧要,您可以使用 0-9
代替,如果您愿意的话:
find /dev -maxdepth 1 -regextype posix-egrep -regex '.*[^0-9][0-9]{1,2}'
或者:
ls /dev/*[^0-9]?[0-9]
关于bash - grep 没有那个文件或目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37232647/