在grep命令中使用+时,为什么需要进行转义?

时间:2017-10-05 06:41:17

标签: regex bash grep

我想在文本文件中找到以几个'='符号开头的行,如下所示。

Line one
And this is Line two
=======text in line three
Line four
=======text in line five
Line six

但是当我使用命令时:

grep '^=+'

它什么也没输出。但如果使用如:

grep '^=\+'

我可以获得预期的输出。我的问题是,当我们不想逃避+符号时,为什么我们需要逃避*符号?这意味着我可以发出以下命令并获得输出。

grep '^=*'

*+符号之间的差异是什么?在+命令中将grep视为特殊字符?

1 个答案:

答案 0 :(得分:7)

默认情况下,grep将模式解析为BRE (Basic Regular Expressions) POSIX表达式。这意味着,\+被解析为匹配1个或多个重复的量词,+被解析为文字+符号。在ERE POSIX中,反之亦然,+是量词,\+是文字+符号。要使用ERE POSIX语法,请使用grep -E 'pattern'

所以,这些是平等的:

grep 'a\+'   # Finds 'aaaaa'
grep -E 'a+' # Finds 'aaaaa'

grep 'a+'   # Finds 'a+'
gre -E 'a\+' # Finds 'a+'

请注意,\+并非始终适用于不同的grep实施,而通常的解决方法是使用*重复模式,即a\+ => aa*

*是在BRE和ERE (Extended Regular Expressions) POSIX中匹配0次或多次重复的量词,如果转义,则匹配文字*符号。