我对于在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/