如何使用正则expression式或在Cygwin的grep?

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

grep "string1" my.file 

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

 grep "string2" my.file 

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

 grep "string1|string2" my.file 

什么也不返回

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

使用| 字符不会在基本正则expression式中转义,只会匹配| 文字。 例如,如果你有一个文件的内容

 string1 string2 string1|string2 

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

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

为了使用交替操作符| , 你可以:

  1. 使用一个基本的正则expression式(只是grep )并转义| 正则expression式中的字符

    grep "string1\|string2" my.file

  2. 使用egrepgrep -E的扩展正则expression式,正如Julian在他的回答中已经指出的那样

    grep -E "string1|string2" my.file

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

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

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

  • 基本与扩展正则expression式
  • 匹配控制 ,它解释了-e

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

另外,您可能需要转义pipe道符号。

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

我从来不使用pipe道,因为它不那么明显,而且工作也很尴尬。

你可以通过阅读精细的手册grep(1)find这个信息,你可以通过运行'man grep'find它。 它描述了grep和egrep之间的区别,以及基本和正则expression式,以及关于grep的许多其他有用信息。