Answers:
怎么样:
ls *[!0-9][0-9].txt
将!
在该组的开始补充其含义。
如评论中所述,这是bash的工作,请尝试例如:
printf "%s\n" *[!0-9][0-9].txt
ls
此处的bash(即)不支持正则表达式。这些是文件名表达式(全球)。您可以在示例中看到差异:这*
是一个通配符,在正则表达式中不存在,可用于.*
实现相同的目的。正则表达式比遍历功能强大得多。
该问题要求使用正则表达式。Bash因此ls
不支持正则表达式。它支持的文件名表达式(Globbing)是通配符的一种形式。正则表达式比这更强大。
如果您确实想使用正则表达式,则可以这样使用find -regex
:
find . -maxdepth 1 -regex '\./.*[^0-9][0-9]\.txt'
默认情况下,查找是递归的,但ls
不是。要仅在当前目录中查找文件,可以使用禁用递归-maxdepth 1
。查找具有路径的文件名与之匹配,这就是为什么./
如果在中运行find 则文件名以之开头的原因.
。正则表达式首先\./
要解决这个问题。请注意,在正则表达式中,.
是一个与任何字符匹配的特殊字符,但是在这里我们确实需要一个点,这就是为什么我们使用反斜杠将其转义的原因。我们对in中的点进行相同的操作.txt
,因为正则表达式否则也会匹配Atxt
。数字类与用于globbing的类相同,只是您需要^
而不是!
反转字符类。
如果要获取的输出ls
,则可以这样使用-exec ls
:
find . -maxdepth 1 -regex '\./.*[^0-9][0-9]\.txt' -exec ls -lah {} \;
find
支持几种不同的正则表达式。您可以指定一个-regextype
,例如:
find . -maxdepth 1 -regextype egrep -regex '\./.*[^0-9][0-9]\.txt'
对我来说,可能的类型是:'findutils-default','awk','egrep','ed','emacs','gnu-awk','grep','posix-awk','posix-basic' ,“ posix-egrep”,“ posix扩展”,“ posix-minimal-basic”,“ sed”您可以运行find -regextype help
以查找系统支持的功能。
使用您已经在使用的ksh扩展glob(或bash -O extglob
or zsh -o kshglob
),将是:
ls -d -- ?(*[![:digit:]])[[:digit:]].txt
要么
ls -d -- !(*[[:digit:]])[[:digit:]].txt
如果你想匹配a1.txt
和2.txt
,但不会a12.txt
也没有12.txt
。
但是请注意,在ksh和bash中(除非您设置failglob
选项以获得类似于zsh的行为),如果该模式与任何文件都不匹配,则该模式将按字面值传递给ls
,并且如果该(奇怪名称的)文件发生存在,ls
即使它与模式本身不匹配,也会被列出。
若要包含.2.txt
,请在中设置dotglob
选项,在bash
中添加(D)
glob限定符zsh
,或将in 设置FIGNORE
为。!(.|..)
ksh93
shopt -s extglob
。