我有这个文件:
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
不起作用。那么,如何才能获得正确的输出呢?
你可以用这个
grep
。在多个地方使用量词(在 BRE 中)的想法\{1,\}
是匹配一起使用的组中的至少一个字符。一个便携式版本将是做在
grep
支持 ERE 的版本上,例如 GNU grep,不需要表达式上的额外转义字符您可以将字符类组替换为与区域无关的组
[0-9]
,例如and 。[a-z]
[[:digit:]]
[[:lower:]]
正则表达式 - 回顾
您可以将其与 GNU 一起使用
grep
:您的命令的问题是您没有量化
[a-z]
,因此它只查找一个字符。使用 standard
grep
,您将为实用程序提供您想要匹配行的单独表达式。强制前
\{n,m\}
一个表达式至少匹配n
一次,最多匹配m
一次。这意味着\{1,\}
使前一个表达式至少匹配一次,就像+
在 POSIX 扩展正则表达式中所做的那样。使用 Raku(以前称为 Perl_6)
样本输入:
样本输出:
这是使用 Perl 编程语言家族成员 Raku 的解决方案。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 /
可能符合要求。https://docs.raku.org/language/regexes
https://raku.org