我想在文本文件中找到以几个'='符号开头的行,如下所示。
Line one
And this is Line two
=======text in line three
Line four
=======text in line five
Line six
但是当我使用命令时:
grep '^=+'
它什么也没输出。但如果使用如:
grep '^=\+'
我可以获得预期的输出。我的问题是,当我们不想逃避+
符号时,为什么我们需要逃避*
符号?这意味着我可以发出以下命令并获得输出。
grep '^=*'
*
和+
符号之间的差异是什么?在+
命令中将grep
视为特殊字符?
答案 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次或多次重复的量词,如果转义,则匹配文字*
符号。