如何使用正则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
为了使用交替操作符|
, 你可以:
-
使用一个基本的正则expression式(只是
grep
)并转义|
正则expression式中的字符grep "string1\|string2" my.file
-
使用
egrep
或grep -E
的扩展正则expression式,正如Julian在他的回答中已经指出的那样grep -E "string1|string2" my.file
-
如果要匹配两种不同的模式,则还可以在
-e
选项中单独指定它们:grep -e "string1" -e "string2" my.file
您可能会发现grep
参考的以下部分很有用:
- 基本与扩展正则expression式
- 匹配控制 ,它解释了
-e
您可能需要使用egrep
或grep -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的许多其他有用信息。