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

发布于 2024-12-11 13:51:48 字数 338 浏览 0 评论 0 原文

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

grep "string1" my.file

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

grep "string2" my.file

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

,但

grep "string1|string2" my.file

在语法正确的正则表达式测试应用程序中不返回任何内容

,那么为什么它不适用于 cygwin 中的 grep ?

I need to return results for two different matches from a single file.

grep "string1" my.file

correctly returns the single instance of string1 in my.file

grep "string2" my.file

correctly returns the single instance of string2 in my.file

but

grep "string1|string2" my.file

returns nothing

in regex test apps that syntax is correct, so why does it not work for grep in cygwin ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

落花浅忆 2024-12-18 13:51:48

在基本正则表达式中使用 | 字符而不对其进行转义将仅匹配 | 文字。例如,如果您有一个包含内容的文件

string1
string2
string1|string2

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

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

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

  1. 使用基本正则表达式(只需 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 参考的以下部分很有用:

Using the | character without escaping it in a basic regular expression will only match the | literal. For instance, if you have a file with contents

string1
string2
string1|string2

Using grep "string1|string2" my.file will only match the last line

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

In order to use the alternation operator |, you could:

  1. Use a basic regular expression (just grep) and escape the | character in the regular expression

    grep "string1\|string2" my.file

  2. Use an extended regular expression with egrep or grep -E, as Julian already pointed out in his answer

    grep -E "string1|string2" my.file

  3. If it is two different patterns that you want to match, you could also specify them separately in -e options:

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

You might find the following sections of the grep reference useful:

陌路终见情 2024-12-18 13:51:48

您可能需要使用 egrepgrep -E。管道 OR 符号是“扩展”grep 的一部分,基本 Cygwin grep 可能不支持。

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

You may need to either use egrep or grep -E. The pipe OR symbol is part of 'extended' grep and may not be supported by the basic Cygwin grep.

Also, you probably need to escape the pipe symbol.

梦断已成空 2024-12-18 13:51:48

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

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

The best and most clear way I've found is:
grep -e REG1 -e REG2 -e REG3 _FILETOGREP_

I never use pipe as it's less evident and very awkward to get working.

爱给你人给你 2024-12-18 13:51:48

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

You can find this information by reading the fine manual: grep(1), which you can find by running 'man grep'. It describes the difference between grep and egrep, and basic and regular expressions, along with a lot of other useful information about grep.

橘香 2024-12-18 13:51:48

grep -P

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

grep -P "string1|string2" my.file

来自 grep --help:

  -P, --perl-regexp         PATTERNS are Perl regular expressions

grep -P

Late to this party, but none of the other answers worked for me. (I was grepping for \d digits.) This worked:

grep -P "string1|string2" my.file

From grep --help:

  -P, --perl-regexp         PATTERNS are Perl regular expressions
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文