gpt4 book ai didi

regex - grep 中的转义字符

转载 作者:行者123 更新时间:2023-12-01 04:49:19 25 4
gpt4 key购买 nike

我对转义交替运算符需要多少个反斜杠有点困惑 |在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-backslash case?

编辑:

使用这个简单的参数打印程序,
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 option 用于表示多个搜索操作。替换是隐含的:

$ 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com