将多个 grep 与正则表达式结合起来

将多个 grep 与正则表达式结合起来

我有这个文件:

10 replies
Big Horse
123sdf562
replies
1354654
Fat Cat
2 replies
White Horse
Big Cat
Little Dog
5 replies
725vgfvjgh123
Black Horse
Brown Cow
8798jgjh

我想提取包含单词 horse 的行,该单词的回复前面有一个数字以及数字括起来的字母。所以我想要的输出必须是:

10 replies
Big Horse
123sdf562
2 replies
White Horse
5 replies
725vgfvjgh123
Black Horse

这段代码grep '[0-9] replies\|[0-9][a-z]\|Horse' file返回

Big Horse
123sdf562
2 replies
White Horse
5 replies
725vgfvjgh123
Black Horse
8798jgjh

8798jgjh不应出现在输出中,因为jgjh未用数字括起来。

grep '[0-9] replies\|[0-9][a-z][0-9]\|Horse' file不起作用。那么,怎样才能达到正确的输出呢?

答案1

你可以用这个grep。在多个地方使用量词(在 BRE 中)的想法\{1,\}是匹配所使用的组中的至少一个字符。便携式版本将是

grep '[0-9]\{1,\}[[:space:]]\{1,\}replies\|Horse\|[0-9]\{1,\}[a-z]\{1,\}[0-9]\{1,\}' file

grep支持 ERE 的版本上,例如 GNU grep,表达式上不需要额外的转义字符

grep -E '[0-9]{1,}[[:space:]]+replies|Horse|[0-9]{1,}[a-z]{1,}[0-9]{1,}' file

您可以将字符类组替换为与语言环境无关的组[0-9],例如和。[a-z][[:digit:]][[:lower:]]

正则表达式 - 回顾

答案2

您可以将其与 GNU 一起使用grep

$ grep 'Horse\|^[0-9]\+ replies$\|^[0-9]\+[^0-9]\+[0-9]\+$' file
10 replies
Big Horse
123sdf562
2 replies
White Horse
5 replies
725vgfvjgh123
Black Horse

您的命令的问题在于您没有量化[a-z],因此它只查找一个字符。

答案3

使用 standard grep,您可以向实用程序提供您想要匹配行的单独表达式。

grep \
    -e 'Horse' \
    -e '[[:digit:]]\{1,\} replies' \
    -e '[[:digit:]]\{1,\}[[:alpha:]]\{1,\}[[:digit:]]\{1,\}' file

强制\{n,m\}前一个表达式至少匹配n一次,最多m匹配一次。这意味着\{1,\}前一个表达式至少匹配一次,就像+POSIX 扩展正则表达式中所做的那样。

答案4

使用 Raku(以前称为 Perl_6)

raku -ne '.put if .grep( m:i/ horse / | / <digit>+ <ws> replies / | / <digit>+ <alpha>+ <digit>+ / );'

输入示例:

10 replies
Big Horse
123sdf562
replies
1354654
Fat Cat
2 replies
White Horse
Big Cat
Little Dog
5 replies
725vgfvjgh123
Black Horse
Brown Cow
8798jgjh

示例输出:

10 replies
Big Horse
123sdf562
2 replies
White Horse
5 replies
725vgfvjgh123
Black Horse

这是使用 Raku(Perl 编程语言家族的成员)的解决方案。 Raku(又名 Perl6)工作始于 2000 年,其中包括对 PCRE(正则表达式)的重大修订,一些人认为它更具可读性。

上面的代码使用 Raku 的grep命令,它可以采用多个m/…/正则表达式匹配器,在本例中通过|布尔 OR 连接。请注意,第一个匹配器将允许不区分大小写的匹配,horse因为它使用:i不区分大小写的“副词”。如果您只想Horse匹配,则进行相应更改(并删除:i副词)。

当然,在编写正则表达式时要小心谨慎,并且您应该注意,不仅会m/ Horse /匹配Big Horse, Black Horse, 和White Horse, 而且Horse-faced还会匹配。您可能只需要包含Horsewhen 前面有另一个单词且中间有空格的行,在这种情况下m/ <alpha>+ <ws> Horse /可能符合要求。

https://docs.raku.org/language/regexes
https://raku.org

相关内容