Bash正则表达式:如何使用'grep'或'ls'匹配n次

thi*_*ign 3 regex bash grep ls

我想用以下方式匹配n位数与grep或ls:

echo "ABCD150915.7z" | grep "ABCD[[:digit:]]{6}.7z"
Run Code Online (Sandbox Code Playgroud)

以上是行不通的,我现在尝试了很多方法..怎么做到这一点?

我知道还有其他方法,但请注意我想知道这是否有可能:[[:digit:]]和{6}使用grep或ls.

Tom*_*ech 8

是的,可以使用以下两种方法之一:

echo "ABCD150915.7z" | grep -E "ABCD[[:digit:]]{6}.7z"
Run Code Online (Sandbox Code Playgroud)

启用扩展正则表达式模式-E意味着可以理解花括号.

或者,你可以逃避花括号:

echo "ABCD150915.7z" | grep "ABCD[[:digit:]]\{6\}.7z"
Run Code Online (Sandbox Code Playgroud)

如果要列出与模式匹配的所有文件,可以使用glob扩展:

ls ABCD[0-9][0-9][0-9][0-9][0-9][0-9].7z
Run Code Online (Sandbox Code Playgroud)

...如果你正在考虑循环浏览这些文件,你应该这样做:

for file in ABCD[0-9][0-9][0-9][0-9][0-9][0-9].7z; do
    # stuff with "$file"
done
Run Code Online (Sandbox Code Playgroud)

建议failglob在这两种情况下启用(使用shopt -s failglob),这样当没有文件与模式匹配时,不执行命令/循环.

[0-9]这些例子中是不完全一样的[[:digit:]],所以如果你需要严格匹配任何被认为是数字的,那么你应该使用来代替.

要明确的是,当你这样做时ls ABCD[0-9][0-9][0-9][0-9][0-9][0-9].7z,shell会在将glob 传递给参数列表之前将其扩展为参数列表ls,因此ls除了回显这些参数之外,它实际上并没有做太多.这与传递给的单引号参数形成对比grep,后者被解释grep为正则表达式.Glob表达式和正则表达式是两个不同的东西,所以你不能指望它们的语法是相同的.