假设我有以下文件:
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#
的扩展全局变量)。*
##
+