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

问题描述 投票:5回答:4

我想通过以下方式用grepls匹配n位数字:

echo "ABCD150915.7z" | grep "ABCD[[:digit:]]{6}.7z"

上面的方法不起作用,我现在已经尝试了很多方法...该怎么做?

我知道还有其他方法,但是请注意,我想知道这是否特别可行:[[:digit:]]{6}使用grepls

regex bash grep ls
4个回答
10
投票

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

echo "ABCD150915.7z" | grep -E "ABCD[[:digit:]]{6}.7z"

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

或者,您也可以使用大括号:

echo "ABCD150915.7z" | grep "ABCD[[:digit:]]\{6\}.7z"

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

ls ABCD[0-9][0-9][0-9][0-9][0-9][0-9].7z

...如果您正在考虑遍历这些文件,则应像这样:

for file in ABCD[0-9][0-9][0-9][0-9][0-9][0-9].7z; do
    # stuff with "$file"
done

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

这些示例中的[0-9][[:digit:]]并不完全相同,因此,如果您要求与任何被认为是数字的字符进行严格匹配,则应该使用该数字。

要清楚,当您执行ls ABCD[0-9][0-9][0-9][0-9][0-9][0-9].7z时,shell会将glob扩展为参数列表before,将其传递给ls,因此ls除了回显这些参数外,实际上并没有做其他事情。这与传递给grep的单引号参数形成对比,后者由grep解释为正则表达式。 Glob表达式和正则表达式是两件事,因此您不能期望它们的语法相同。


1
投票

由于基本的grep使用BRE(基本正则表达式),因此\{\}的作用类似于重复量词,其中未转义的{}将与文字{}大括号匹配。

grep 'ABCD[[:digit:]]\{6\}\.7z'

更好地使用锚点。

grep '^ABCD[[:digit:]]\{6\}\.7z$'

1
投票

您不需要grep,只需用bash


0
投票

@ Avinash Raj给您的答案是正确的。但是,还有另一种方式。如果您不想转义括号(即,您的grep表达式更长,可能会迷失在括号内),可以使用egrep

© www.soinside.com 2019 - 2024. All rights reserved.