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)
但没有运气。如何匹配这种模式?
注意:将始终有一个文件。我不是要打开多个文件。
您正在尝试在通配模式中使用扩展的正则表达式元字符和 POSIX 字符类(+和[:digit:]);
假设bash或类似,“基本”通配符仅支持少数通配符,例如:
?: 单字*: 零个或多个字符[]: 字符类{}: 列表[!]: 否定字符类与扩展正则表达式中的元字符不同,在“基本”通配符中,无法修改通配符的行为以匹配固定数量的出现;
因此,使用“基本”通配符,最短和最紧密的模式是:
tar -xf test_file-[0-9][0-9][0-9][0-9]-master.tar.gz
Run Code Online (Sandbox Code Playgroud)
与ksh,bash -O extglob并且zsh -o kshglob仅:
test_file-+([[:digit:]])-master.tar.gz\nRun Code Online (Sandbox Code Playgroud)\n\n在 中bash,您必须extglob先设置该选项。这+(...)与给定模式的一次或多次出现相匹配。[:digit:]当括号表达式内[...]是 POSIX 定义的字符类时,其中包括印度-阿拉伯十进制数字(与or[[:digit:]]相同)。[0123456789][0-9]
它将匹配:
\n\ntest_file-1234-master.tar.gz\ntest_file-1-master.tar.gz\ntest_file-123456789-master.tar.gz\nRun Code Online (Sandbox Code Playgroud)\n\n它不会匹配:
\n\ntest_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\nRun Code Online (Sandbox Code Playgroud)\n\n您问题中的命令tar应该像这样完成(带有循环):
shopt -s extglob # bash\n# setopt kshglob # zsh\nfor f in test_file-+([[:digit:]])-master.tar.gz; do\n tar xf "$f"\ndone\nRun Code Online (Sandbox Code Playgroud)\n\n更惯用的短语法zsh是:
setopt extendedglob\nfor f (test_file-[0-9]##-master.tar.gz) tar xf $f\nRun Code Online (Sandbox Code Playgroud)\n\n(相当于 regexp和or#的扩展全局变量)。*##+