Shell

grep 和轉義美元符號

  • January 30, 2015

我想知道哪些文件有字元串$Id$

grep \$Id\$  my_dir/mylist_of_files

返回 0 次。

我發現我必須使用

grep \$Id$ my_dir/mylist_of_files

然後我看到$Id輸出中的 是彩色的,即它已經匹配。

我怎麼能匹配第二個$,為什麼不起作用\$Id\$

第二個$是否是最後一個字元並不重要。

我用grep2.9。


在發布我的問題之前,我使用了Google…

我找到了答案

要在名為 test2 的文件中搜尋 $(美元符號),請輸入:

grep \ $ test2

\(雙反斜杠)字元是必需的,以強制 shell 將$(單反斜杠,美元符號)傳遞給 grep 命令。\(單反斜杠)字元告訴 grep 命令將後面的字元(在此範例中為 $)視為文字字元而不是表達式字元。使用 fgrep 命令來避免使用轉義字元(例如反斜杠)的必要性。

但我不明白為什麼grep \$Id有效,為什麼grep \\$Id\\$無效。

我有點困惑…

這裡有兩個單獨的問題。

  1. grep使用基本正則表達式(BRE),並且$是 BRE 中僅在表達式末尾的特殊字元。這樣做的結果是$in的 2 個實例$Id$不相等。第一個是普通字元,第二個是匹配行尾的錨。要使第二個$匹配成為文字$,您必須使用反斜杠對其進行轉義,即$Id\$. 轉義第一個$也可以:\$Id\$,我更喜歡這個,因為它看起來更一致。¹
  2. 這裡有兩種完全不相關的轉義/引用機制: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\$

引用自:https://unix.stackexchange.com/questions/32018