我正在学习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\}$
所有这些命令都以相同的响应结束。我做错了什么?
答案 0 :(得分:4)
试试这个:
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]
正如本杰明在评论中提到的,这很简单,不需要正则表达式。而是使用 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-safe。如果您所在的地区非常重要,则可以使用0-9
代替,如果您愿意:
find /dev -maxdepth 1 -regextype posix-egrep -regex '.*[^0-9][0-9]{1,2}'
或者:
ls /dev/*[^0-9]?[0-9]
答案 1 :(得分:3)
您正在寻找的命令是:
ls /dev | grep -E '^.*[0-9]{1,2}$'
ls
而非less
列出目录{1,2}
)是POSIX ERE的一项功能,需要egrep
或-E
对ls
输出做任何事情都不赞成。更好的方法是使用常规的glob(这里使用printf
输出它,而不是将其传递给其他东西):
printf "%s\n" /dev/*[0-9]
答案 2 :(得分:2)
在每个命令中将VLookup
替换为less
。
更新:
我看到您使用ls
更新了您的问题,但尚未完成更新以包含正确的shell引用。查看其他答案的例子。
答案 3 :(得分:2)
您需要将模式参数放在引号中grep
。如果没有引号,*
字符会使其成为文件名通配符,并且当前目录中没有与该模式匹配的文件,因此您会收到该错误消息。
ls /dev | grep '^.*[0-9]{1,2}$'
正如其他答案所指出的,列出目录中文件的命令是ls
,less
用于查看文本文件的内容。