Regex 混淆何时(不)使用反斜杠'\';逃走

Regex 混淆何时(不)使用反斜杠'\';逃走,regex,bash,shell,command-line,grep,Regex,Bash,Shell,Command Line,Grep,我对什么时候应该使用“\”感到非常困惑 考虑以下例子: (一) 它匹配以bz、gz或zip开头的结果 (二) 输出:(555)123-4567 对于示例(1),为什么不要求用“\”来转义括号() 对于示例(2),为什么转义()需要“\”呢 我正在使用Ubuntu发行版。您的每个示例中的括号表示不同的内容 在第一个示例中,括号是分组的,与文件名不匹配。因此,您可以找到以bz开头的文件,而不是(bz) 在第二个示例中,括号是文字,实际出现在您匹配的电话号码中。每个示例中的括号表示不同的含义 在第一

我对什么时候应该使用“\”感到非常困惑

考虑以下例子:

(一)

它匹配以bz、gz或zip开头的结果

(二)

输出:(555)123-4567


  • 对于示例(1),为什么不要求用“\”来转义括号()
  • 对于示例(2),为什么转义()需要“\”呢

  • 我正在使用Ubuntu发行版。

    您的每个示例中的括号表示不同的内容

    在第一个示例中,括号是分组的,与文件名不匹配。因此,您可以找到以
    bz
    开头的文件,而不是
    (bz


    在第二个示例中,括号是文字,实际出现在您匹配的电话号码中。

    每个示例中的括号表示不同的含义

    在第一个示例中,括号是分组的,与文件名不匹配。因此,您可以找到以
    bz
    开头的文件,而不是
    (bz


    在您的第二个示例中,括号是文字,实际上出现在您匹配的电话号码中。

    请注意,grep的
    -E
    选项实际上更改了需要转义的内容—没有它,
    (…)
    匹配文字参数和
    \(…\)
    是一个组,但是
    -E
    的含义是相反的。请注意,grep的
    -E
    选项实际上改变了需要转义的内容——没有它,
    (…)
    匹配文本参数,
    \(…)
    是一个组,但是
    -E
    的含义是相反的。
    $ grep -Eh '^(bz|gz|zip)' filenames.txt
    
    $ echo "(555) 123-4567" | grep -E '^\(?[0-9][0-9][0-9]\)? [0-9] [0-9][0-9]$'