带有多个数字的正则表达式文件名

Siv*_*iva 5 filenames wildcards files

假设我有以下文件:

test_file-1234-master.tar.gz
Run Code Online (Sandbox Code Playgroud)

我尝试tar使用以下命令取消

 tar -xf test_file-[0-9]+-master.tar.gz
 tar -xf test_file-[:digit]-master.tar.gz
Run Code Online (Sandbox Code Playgroud)

但没有运气。如何匹配这种模式?

注意:将始终有一个文件。我不是要打开多个文件。

kos*_*kos 5

您正在尝试在通配模式中使用扩展的正则表达式元字符和 POSIX 字符类(+[:digit:]);

假设bash或类似,“基本”通配符仅支持少数通配符,例如:

  • ?: 单字
  • *: 零个或多个字符
  • []: 字符类
  • {}: 列表
  • [!]: 否定字符类

与扩展正则表达式中的元字符不同,在“基本”通配符中,无法修改通配符的行为以匹配固定数量的出现;

因此,使用“基本”通配符,最短和最紧密的模式是:

tar -xf test_file-[0-9][0-9][0-9][0-9]-master.tar.gz
Run Code Online (Sandbox Code Playgroud)


cha*_*aos 4

ksh,bash -O extglob并且zsh -o kshglob仅:

\n\n
test_file-+([[:digit:]])-master.tar.gz\n
Run Code Online (Sandbox Code Playgroud)\n\n

在 中bash,您必须extglob先设置该选项。这+(...)与给定模式的一次或多次出现相匹配。[:digit:]当括号表达式内[...]是 POSIX 定义的字符类时,其中包括印度-阿拉伯十进制数字(与or[[:digit:]]相同)。[0123456789][0-9]

\n\n

它将匹配:

\n\n
test_file-1234-master.tar.gz\ntest_file-1-master.tar.gz\ntest_file-123456789-master.tar.gz\n
Run Code Online (Sandbox Code Playgroud)\n\n

它不会匹配

\n\n
test_file-1b-master.tar.gz\ntest_file--master.tar.gz\ntest_file-a1-master.tar.gz\ntest_file-abcd-master.tar.gz\ntest_file-\xe2\x85\xa5-master.tar.gz # roman numeral\ntest_file-\xd9\xa8-master.tar.gz  # Eastern Arabic decimal digit\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

您问题中的命令tar应该像这样完成(带有循环):

\n\n
shopt -s extglob # bash\n# setopt kshglob # zsh\nfor f in test_file-+([[:digit:]])-master.tar.gz; do\n    tar xf "$f"\ndone\n
Run Code Online (Sandbox Code Playgroud)\n\n

更惯用的短语法zsh是:

\n\n
setopt extendedglob\nfor f (test_file-[0-9]##-master.tar.gz) tar xf $f\n
Run Code Online (Sandbox Code Playgroud)\n\n

(相当于 regexp和or#的扩展全局变量)。*##+

\n