我想通过以下方式用grep
或ls
匹配n位数字:
echo "ABCD150915.7z" | grep "ABCD[[:digit:]]{6}.7z"
上面的方法不起作用,我现在已经尝试了很多方法...该怎么做?
我知道还有其他方法,但是请注意,我想知道这是否特别可行:[[:digit:]]
和{6}
使用grep
或ls
。
是,可以使用以下两种方法之一:
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表达式和正则表达式是两件事,因此您不能期望它们的语法相同。
由于基本的grep使用BRE(基本正则表达式),因此\{\}
的作用类似于重复量词,其中未转义的{}
将与文字{
,}
大括号匹配。
grep 'ABCD[[:digit:]]\{6\}\.7z'
更好地使用锚点。
grep '^ABCD[[:digit:]]\{6\}\.7z$'
您不需要grep
,只需用bash
:
@ Avinash Raj给您的答案是正确的。但是,还有另一种方式。如果您不想转义括号(即,您的grep表达式更长,可能会迷失在括号内),可以使用egrep