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

问题描述 投票:0回答:5

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

grep "string1" my.file

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

grep "string2" my.file

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

但是

grep "string1|string2" my.file

不返回任何内容

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

regex cygwin grep
5个回答
77
投票

在基本正则表达式中使用

|
字符而不转义它只会匹配
|
文字。例如,如果您有一个包含内容的文件

string1
string2
string1|string2

使用

grep "string1|string2" my.file
将仅匹配最后一行

$ grep "string1|string2" my.file
string1|string2

为了使用交替运算符

|
,您可以:

  1. 使用基本正则表达式(只需

    grep
    )并转义正则表达式中的
    |
    字符

    grep "string1\|string2" my.file

  2. 使用带有

    egrep
    grep -E
    的扩展正则表达式,正如 Julian 已经在 他的回答

    中指出的那样

    grep -E "string1|string2" my.file

  3. 如果要匹配的是两种不同的模式,也可以在

    -e
    选项中分别指定:

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

您可能会发现

grep
参考的以下部分很有用:


10
投票

您可能需要使用

egrep
grep -E
。管道 OR 符号是“扩展”grep 的一部分,基本 Cygwin grep 可能不支持。

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


6
投票

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

我从不使用管道,因为它不太明显并且很难开始工作。


0
投票

您可以通过阅读精美手册来找到此信息:grep(1),您可以通过运行“man grep”找到该手册。它描述了 grep 和 egrep 之间的区别,以及基本表达式和正则表达式,以及有关 grep 的许多其他有用信息。


0
投票

grep -P

这次聚会迟到了,但其他答案都不适合我。 (我正在寻找 \d 数字。)这有效:

grep -P "string1|string2" my.file

来自 grep --help:

  -P, --perl-regexp         PATTERNS are Perl regular expressions
© www.soinside.com 2019 - 2024. All rights reserved.