如何编写这个grep正则表达式

时间:2010-12-24 16:51:49

标签: regex shell grep

if [ '`echo "$url" | grep (\.tar\.gz|\.tar\.bz2|\.zip|\.rar|\.7z)$`' ] ; then

语法错误,我只想检查文件扩展名。

3 个答案:

答案 0 :(得分:4)

首先,您需要删除'',否则测试只是一个总是求值为true的字符串。您需要将正则表达式放在引号中,因为括号由bash解释。您还需要使用egrep(相当于grep -E)。

if [ `echo "$url" | egrep "(\.tar\.gz|\.tar\.bz2|\.zip|\.rar|\.7z)$"` ] ; then

您还可以通过将.分解出组并将tar.{gz,bz2}分组来缩短正则表达式:

if [ `echo "$url" | egrep "\.(tar\.(gz|bz2)|zip|rar|7z)$"` ] ; then

对于将来,请注意bash给出的错误,告诉你很多:bash: syntax error near unexpected token (表示错误在(附近,我刚刚向您展示的正是在哪里错误在于。

Jonathan's answer提供了有关改进测试的更多提示。

答案 1 :(得分:3)

假设:

if [ '`echo "$url" | grep (\.tar\.gz|\.tar\.bz2|\.zip|\.rar|\.7z)$`' ] ; then

本身,这不是语法错误 - 任何语法错误都可能在附近。

另一方面,这也不是你想要的。方括号之间的字符串是单引号;它本身就是。测试检查字符串是否为空(不是)并继续执行then子句中的代码。

您需要使用以下内容:

if [ $(echo "$url" | grep -E '\.(tar\.gz|tar\.bz2|zip|rar|7z|tgz)$' ) ] ; then
  • 优先使用“$(...)”作为反向标记。
  • 使用“grep -E”激活扩展正则表达式。
  • 排除领先'。'扩展名。
  • 请记住,'.tgz'是gzipped tar文件的有效(尽管很少见)扩展。

然后,正如Dennis在评论中指出的那样,您可以观察到根本没有必要使用测试命令或命令替换:

if echo "$url" | grep -E '\.(tar\.gz|tar\.bz2|zip|rar|7z|tgz)$' >/dev/null ; then

这将检查管道的退出状态,即grep的退出状态,如果其中一个后缀被识别,则为0(成功),如果没有,则为1(失败)。然后,如果这是我们正在使用的Bash,你也可以避开管道:

if grep -E '\.(tar\.gz|tar\.bz2|zip|rar|7z|tgz)$' <<< "$url" >/dev/null ; then

我们也可以通过重写代码来使用case语句来避免使用第二个进程:

case "$url" in
(*.tar.gz|*.tar.bz2|*.zip|*.rar|*.7z|*.tgz|*.xz)
    # Do what was in the 'then' clause
    ;;
(*) # Do what was in the 'else' clause
    ;;
esac
  • 请注意,.xz也是您可能遇到的压缩方案。

答案 2 :(得分:0)

请改为尝试:

grep -E '\.(tar\.gz|tar\.bz2|zip|rar|7z)$'