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

时间:2015-09-16 11:46:26

标签: regex bash grep ls

我希望以下列方式匹配n位数字与grep或ls:

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

上述情况不起作用,我现在尝试了很多方法......如何做到这一点?

我了解其他方式,但请注意我想知道这是否具体:[[:digit:]]和{6}使用grep或ls。

4 个答案:

答案 0 :(得分:8)

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

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

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

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

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

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

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扩展为参数列表,然后将其传递给ls,因此ls isn&除了回应那些论点之外,真的做得很多。这与传递给grep的单引号参数形成对比,后者由grep解释为正则表达式。 Glob表达式和正则表达式是两回事,因此您不能期望它们的语法相同。

答案 1 :(得分:1)

你需要逃避花括号,因为基本的grep使用BRE(基本正则表达式),其中\{\}就像一个重复量词,其中未转义{}与文字{匹配,{{1大括号。

}

最好使用锚点。

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

答案 2 :(得分:0)

答案@Avinash Raj给你的答案是正确的。但还有另一种方式。 如果你不想逃避大括号(即你的grep表达更长,你可能会迷失它们),你可以使用 egrep

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

答案 3 :(得分:0)

对于L.FeatureGroup

,您不需要markers.clearLayers();
grep
相关问题