grep 和轉義美元符號
我想知道哪些文件有字元串
$Id$
。grep \$Id\$ my_dir/mylist_of_files
返回 0 次。
我發現我必須使用
grep \$Id$ my_dir/mylist_of_files
然後我看到
$Id
輸出中的 是彩色的,即它已經匹配。我怎麼能匹配第二個
$
,為什麼不起作用\$Id\$
。第二個
$
是否是最後一個字元並不重要。我用
grep
2.9。在發布我的問題之前,我使用了Google…
要在名為 test2 的文件中搜尋 $(美元符號),請輸入:
grep \ $ test2
\(雙反斜杠)字元是必需的,以強制 shell 將$(單反斜杠,美元符號)傳遞給 grep 命令。\(單反斜杠)字元告訴 grep 命令將後面的字元(在此範例中為 $)視為文字字元而不是表達式字元。使用 fgrep 命令來避免使用轉義字元(例如反斜杠)的必要性。
但我不明白為什麼
grep \$Id
有效,為什麼grep \\$Id\\$
無效。我有點困惑…
這裡有兩個單獨的問題。
grep
使用基本正則表達式(BRE),並且$
是 BRE 中僅在表達式末尾的特殊字元。這樣做的結果是$
in的 2 個實例$Id$
不相等。第一個是普通字元,第二個是匹配行尾的錨。要使第二個$
匹配成為文字$
,您必須使用反斜杠對其進行轉義,即$Id\$
. 轉義第一個$
也可以:\$Id\$
,我更喜歡這個,因為它看起來更一致。¹- 這裡有兩種完全不相關的轉義/引用機制:shell 引用和正則表達式反斜杠引用。問題是正則表達式使用的許多字元對於 shell 也是特殊的,除此之外,正則表達式轉義字元反斜杠也是 shell 引用字元。這就是為什麼你經常看到涉及雙反斜杠的混亂,但我不建議在 shell 引用正則表達式時使用反斜杠,因為它不是很可讀。
相反,最簡單的方法是首先將整個正則表達式放在單引號中,如
'regex'
. 單引號是 shell 引用的最強形式,所以只要你的正則表達式不包含單引號,你就不再需要擔心 shell 引用,可以專注於純 BRE 語法。因此,將其應用回您的原始範例,讓我們將正確的正則表達式 (
\$Id\$
) 放在單引號內。以下應該做你想要的:grep '\$Id\$' my_dir/my_file
原因
\$Id\$
不起作用是因為在應用了 shell 引號刪除(更正確的說法是 shell 引用)後,grep
看到的正則表達式是$Id$
. 如 (1.) 中所述,此正則表達式$Id
僅在行尾匹配文字,因為第一個$
是文字,而第二個是特殊的錨字元。¹ 另請注意,如果您曾經切換到擴展正則表達式 (ERE),例如,如果您決定使用
egrep
(或grep -E
),則該$
字元始終是特殊的。在 ERE中永遠不會匹配任何內容,因為在行尾之後$Id$
不能有字元,所以這是唯一的方法。\$Id\$