我对于在grep的正则表达式中转义交替运算符|需要多少个反斜线感到有些困惑。这

echo abcdef | grep -e"def|zzz"

由于grep不在扩展正则表达式模式下,因此不会输出任何内容。用一个反斜杠转义,
echo abcdef | grep -e"def\|zzz"

打印abcdef。更令人惊讶的是,使用2个反斜杠转义也可以,
echo abcdef | grep -e"def\\|zzz"

打印abcdef。用三个反斜杠转义失败,
echo abcdef | grep -e"def\\\|zzz"

什么都不打印。

有谁有解释,特别是对于2反斜杠的情况?

编辑:

使用这个简单的参数打印程序,
void main(int argc, char** argv)
{
    for (int i = 0; i < argc; i++)
        printf("Arg %d: %s\n", i, argv[i]);
}

我研究了我的shell用上面的命令行做什么:
-e"def|zzz"变成-edef|zzz-e"def\|zzz"变成-edef\|zzz-e"def\\|zzz"变成-edef\\|zzz-e"def\\\|zzz"变成-edef\\\|zzz
因此,所有双引号都将被删除,并且反斜杠和竖线不会被 shell 更改。我怀疑grep本身对文字字符串\\|做了一些特殊的事情。

最佳答案

小写的-e选项用于表示多个搜索操作。暗示着这种交替:

$ echo abcdef | grep -e 'def' -e'zzz'
abcdef
$ echo abczzz | grep -e 'def' -e'zzz'
abczzz

另外,您可以使用上层-E选项来扩展正则表达式表示法:
$ echo abcdef | grep -E 'def|zzz'
abcdef

我相信这可以直接解决您的问题(使用-e进行替换或使用-E扩展正则表达式表示法)。希望这可以帮助 :-)

FWIW,反斜杠的问题在于|对bash具有特殊含义,除非使用单引号,否则必须对其进行转义。这是有关引用和转义规则以及常见陷阱的资源:http://wiki.bash-hackers.org/syntax/quoting

关于regex - grep中的转义字符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42822174/

10-12 22:12