
我的文件內容類似:
A+B
C+D
A+B
這些是字串。我想搜尋 的出現A+B
。所以我將命令寫成:grep 'A+B' test.txt
。但是,如果我寫,grep 'A\+B' test.txt
我不會得到任何結果?而如果代替+
字串 contains .
,如果我添加\
或不添加,我會得到搜尋結果。我不明白:
1)什麼時候應該添加\
,什麼時候不應該添加。
2)為什麼我添加後沒有得到任何結果,+
而我添加後卻得到結果.
答案1
您沒有指定grep
您使用什麼口味,但您可能使用GNU grep
.預設grep
使用Basic Regular Expressions
, 並如 所述man grep
:
基本正規表示式與擴展正規表示式
在基本正規表示式中,元字元 ?、+、{、|、(
和 ) 失去了它們的特殊意義;而是使用反斜線
版本 \?、+、{、\|、( 和 )。
請注意,如果您使用過,-E
您將切換到Extended Regular Expressions (ERE)
並且必須使用,\+
因為預設 in
ERE
和許多其他正規表示式語法+
代表one or more of the preceding character
:
$ grep -E 'A\+B' test.txt
A+B
A+B
所以,回答你的問題:
\
當您想要搜尋文字字元時應該使用。In
BRE
一個點代表any character
就像 in 一樣ERE
。
答案2
In egrep
(或grep -E
) 擴充正規表示式已啟用。這些包括:
+ - match one or more instances of the previous match pattern.
grep
這些可以在 basic 中與前面的反斜線一起使用,它沒有通常的文字含義,而是呼叫egrep
函數。
所以以下是等價的:-
egrep 'A+B'
grep 'A\+B'
在這兩種情況下,匹配都是一個或多個A
s 緊隨其後B
。
因為egrep
'+' 有特殊意義,必須對其進行轉義才能按字面匹配,因此以下內容也是等價的:
egrep 'A\+B'
grep 'A+B'
這些都會匹配A+B
,因為在這兩種情況下都會尋找文字“+”。
egrep
可以透過轉義 in 使用的其他函數grep
包括\|
替代匹配字串 和\{M,N\}
,其中 M 和 N 是表示匹配模式上重複的最小和最大次數的數字。這些都沒有在 中轉義egrep
。