将文件名与前缀、几个数字和后缀正则表达式相匹配

将文件名与前缀、几个数字和后缀正则表达式相匹配

如何匹配文件名abc_NNN.xyz?这是目录内容

[root@ tmp]# ls -ltr
total 0
-rw-r--r--. 1 root root 0 Jan  3 00:42 abc_123.xyz
-rw-r--r--. 1 root root 0 Jan  3 00:42 abc_234.xyz
-rw-r--r--. 1 root root 0 Jan  3 00:42 abc_345.xyz
-rw-r--r--. 1 root root 0 Jan  3 00:43 abc_def_123.xyz
-rw-r--r--. 1 root root 0 Jan  3 00:44 abc_def_234.xyz
-rw-r--r--. 1 root root 0 Jan  3 00:44 abc_def_345.xyz
-rw-r--r--. 1 root root 0 Jan  3 01:57 abc_123_123.xyz
-rw-r--r--. 1 root root 0 Jan  3 01:57 abc_234_234.xyz
-rw-r--r--. 1 root root 0 Jan  3 01:57 abc_345_345.xyz

这个对我有用

[root@ tmp]# ls -ltr abc_[0-9][0-9][0-9].xyz
-rw-r--r--. 1 root root 0 Jan  3 00:42 abc_123.xyz
-rw-r--r--. 1 root root 0 Jan  3 00:42 abc_234.xyz
-rw-r--r--. 1 root root 0 Jan  3 00:42 abc_345.xyz

问题是,在实际场景中我需要匹配abc_NNNNNNNNN.xyz,因此表达式太大。我正在寻找类似的东西abc_[0-9]{3}.xyzabc_[0-9]+3.xyz(显然这些不起作用)

答案1

对于您列出的原始更简单的示例,abc_[0-9]*.xyz将会起作用。显然,这会匹配数字以外的一些内容,但会排除def您列出的文件,因为在这些情况下,第一个下划线不是数字之后的第一个字符。

对于更复杂的示例,可能是时候进行部署了,find这样我们就可以实际使用正则表达式:

$ ls
abc_123_123.xyz  abc_123.xyz  abc_234_234.xyz  abc_234.xyz  abc_345_345.xyz  abc_345.xyz  abc_def_123.xyz  abc_def_234.xyz  abc_def_345.xyz
$ find . -regex '\./abc_[0-9]+\.xyz'
./abc_345.xyz
./abc_234.xyz
./abc_123.xyz

这是 GNU 的情况find,其他变体可能略有不同。

答案2

如果您使用bash,您还可以利用其扩展的通配符功能:

shopt -s extglob
ls abc_+([0-9]).xyz

示例输出:

abc_123456.xyz
abc_123.xyz
abc_1.xyz
abc_3456.xyz
abc_345.xyz
abc_56789.xyz
abc_567.xyz

+([0-9])表达式匹配任意数字的一个或多个实例。这将匹配任何长度的“NNNN”模式。

答案3

正如中提到的POSIX glob — 如何匹配一个或多个 [:digit:]shell globing 不等于正则表达式。您可能最擅长处理输出lsgrep在这种情况下您最初提到的abc_[0-9]{3}.xyz模式将起作用。

您可以将两者结合起来:

[root@ tmp]# ls -ltr abc_[0-9]+.xyz | grep abc_[0-9]{3}.xyz

相关内容