我需要从单个文件返回两个不同匹配的结果。
grep "string1" my.file
正确返回 my.file 中 string1 的单个实例
grep "string2" my.file
正确返回 my.file 中 string2 的单个实例
但是
grep "string1|string2" my.file
不返回任何内容
在正则表达式测试应用程序中,语法是正确的,那么为什么它不适用于 cygwin 中的 grep ?
在基本正则表达式中使用
|
字符而不转义它只会匹配 |
文字。例如,如果您有一个包含内容的文件
string1
string2
string1|string2
使用
grep "string1|string2" my.file
将仅匹配最后一行
$ grep "string1|string2" my.file
string1|string2
为了使用交替运算符
|
,您可以:
使用基本正则表达式(只需
grep
)并转义正则表达式中的 |
字符
grep "string1\|string2" my.file
使用带有
egrep
或 grep -E
的扩展正则表达式,正如 Julian 已经在 他的回答中指出的那样
grep -E "string1|string2" my.file
如果要匹配的是两种不同的模式,也可以在
-e
选项中分别指定:
grep -e "string1" -e "string2" my.file
您可能会发现
grep
参考的以下部分很有用:
-e
您可能需要使用
egrep
或 grep -E
。管道 OR 符号是“扩展”grep 的一部分,基本 Cygwin grep 可能不支持。
此外,您可能需要转义管道符号。
我发现的最好、最清晰的方法是: grep -e REG1 -e REG2 -e REG3 _FILETOGREP_
我从不使用管道,因为它不太明显并且很难开始工作。
您可以通过阅读精美手册来找到此信息:grep(1),您可以通过运行“man grep”找到该手册。它描述了 grep 和 egrep 之间的区别,以及基本表达式和正则表达式,以及有关 grep 的许多其他有用信息。
grep -P
这次聚会迟到了,但其他答案都不适合我。 (我正在寻找 \d 数字。)这有效:
grep -P "string1|string2" my.file
来自 grep --help:
-P, --perl-regexp PATTERNS are Perl regular expressions