我有这个文件:
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
还会匹配。您可能只需要包含Horse
when 前面有另一个单词且中间有空格的行,在这种情况下m/ <alpha>+ <ws> Horse /
可能符合要求。