如何在Cygwin中的grep中使用正则表达式?

rob*_*rob 52 regex grep cygwin

我需要从单个文件返回两个不同匹配的结果.

grep "string1" my.file
Run Code Online (Sandbox Code Playgroud)

正确返回my.file中string1的单个实例

grep "string2" my.file
Run Code Online (Sandbox Code Playgroud)

正确返回my.file中string2的单个实例

grep "string1|string2" my.file
Run Code Online (Sandbox Code Playgroud)

没有回报

在正则表达式测试应用程序中语法是否正确,那么为什么它不能用于cygwin中的grep?

Xav*_*ica 77

使用|字符而不在基本正则表达式中转义它只会匹配|文字.例如,如果您有一个包含内容的文件

string1
string2
string1|string2
Run Code Online (Sandbox Code Playgroud)

使用grep "string1|string2" my.file只会匹配最后一行

$ grep "string1|string2" my.file
string1|string2
Run Code Online (Sandbox Code Playgroud)

为了使用交替运算符|,您可以:

  1. 使用基本正则表达式(just grep)并转义|正则表达式中的字符

    grep "string1\|string2" my.file

  2. 使用扩展的正则表达式用egrepgrep -E,如朱利安已经指出他的回答

    grep -E "string1|string2" my.file

  3. 如果要匹配两种不同的模式,还可以在-e选项中单独指定它们:

    grep -e "string1" -e "string2" my.file

您可能会发现该grep参考的以下部分很有用:

  • 正如@Julian已经指出的那样,如果你正在使用像```,`+`,`?`和`()`这样的元字符,并期望它们能够正常工作而不需要转义它们(就像在正常的正则表达式中那样),你应该使用`egrep`.例如,`egrep"string1 | string2"`执行OR.如果你逃避`|`元字符,你仍然可以使用`grep`. (6认同)

Jul*_*ian 10

您可能需要使用egrepgrep -E.管道OR符号是'extended'grep的一部分,基本的Cygwin grep可能不支持.

此外,您可能需要转义管道符号.

  • `grep -E` 等价于 `egrep`;使用 `egrep` 可能更惯用。在`grep`中,`|`只是一个普通字符,`\|`指定交替。在`egrep`中,`|`指定交替,而`\|`只是竖线字符。 (2认同)

小智 6

我发现的最好和最清晰的方法是:grep -e REG1 -e REG2 -e REG3 _FILETOGREP_

我从不使用烟斗,因为它不那么明显,而且很难开始工作.