我的文件内容类似如下:
A+B
C+D
A+B
这些是字符串。我想搜索 的出现A+B
。所以我将命令写为:grep 'A+B' test.txt
。但是,如果我写 ,grep 'A\+B' test.txt
则不会得到任何结果?而如果 而不是+
字符串包含.
,如果我添加\
或不添加 ,则会得到搜索结果。我不明白:
1)什么时候应该添加\
,什么时候不应该添加。
2)为什么我添加后没有得到任何结果,+
而添加后却得到了结果.
答案1
您没有指定grep
使用哪种风格,但您可能使用GNU grep
。默认情况下grep
使用Basic Regular Expressions
,并且如中所述man grep
:
基本正则表达式与扩展正则表达式
在基本正则表达式中,元字符 ?、+、{、|、( 和
) 失去其特殊含义;而是使用反斜杠
版本 \?、+、{、\|、( 和 )。
请注意,如果您使用,-E
您将切换到Extended Regular Expressions (ERE)
并且必须使用,\+
因为默认情况下,在
ERE
和许多其他正则表达式语法中+
代表one or more of the preceding character
:
$ grep -E 'A\+B' test.txt
A+B
A+B
因此,回答你的问题:
\
当您想要搜索文字字符时应该使用。一个
BRE
点代表any character
就像 一样ERE
。
答案2
在egrep
(或grep -E
) 中启用扩展正则表达式。这些包括:
+ - match one or more instances of the previous match pattern.
这些可以在基本中使用,grep
前面带有反斜杠,这不具有其通常的文字含义,而是调用函数egrep
。
因此以下是等效的:-
egrep 'A+B'
grep 'A\+B'
在两种情况下,匹配都是一个或多个A
s 后紧接着B
。
因为egrep
'+' 有特殊含义,所以必须进行转义才能进行字面匹配,因此以下也是等效的:
egrep 'A\+B'
grep 'A+B'
这两种情况都会匹配A+B
,因为两种情况下都需要寻找文字“+”。
egrep
中可以通过转义使用的其他函数grep
包括\|
用于替代匹配字符串和\{M,N\}
,其中 M 和 N 是代表匹配模式的最小和最大重复次数的数字。这些在中不会被转义egrep
。