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 extglobor 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。