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

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

假设我有以下文件:

test_file-1234-master.tar.gz

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

 tar -xf test_file-[0-9]+-master.tar.gz
 tar -xf test_file-[:digit]-master.tar.gz

但没有运气。这个图案要怎么搭配呢?

笔记:总会有一个文件。我不想打开多个文件。

答案1

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

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

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

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

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

tar -xf test_file-[0-9][0-9][0-9][0-9]-master.tar.gz

答案2

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

test_file-+([[:digit:]])-master.tar.gz

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

它将匹配:

test_file-1234-master.tar.gz
test_file-1-master.tar.gz
test_file-123456789-master.tar.gz

它会不是匹配:

test_file-1b-master.tar.gz
test_file--master.tar.gz
test_file-a1-master.tar.gz
test_file-abcd-master.tar.gz
test_file-Ⅵ-master.tar.gz # roman numeral
test_file-٨-master.tar.gz  # Eastern Arabic decimal digit

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

shopt -s extglob # bash
# setopt kshglob # zsh
for f in test_file-+([[:digit:]])-master.tar.gz; do
    tar xf "$f"
done

更惯用的短语法zsh是:

setopt extendedglob
for f (test_file-[0-9]##-master.tar.gz) tar xf $f

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

相关内容