Linux

在 grep 正則表達式中轉義特殊字元

  • February 11, 2017

我正在嘗試在文件上執行 grep 正則表達式,我必須排除出現“00”和“0”的行。我想出了這個表達:

grep -a -E \"stored\"\:\ \"\*123\*(?!00)[0-9]{2,5}\#\" $filename

但是當我嘗試在 bash 中執行它時,我要麼得到

-bash !00: event not found, 或 (一旦我輸入set +H),

-bash: syntax error near unexpected token('`

請問我需要做什麼才能在bash中正確轉義這個正則表達式?

您收到一條錯誤消息,因為您沒有 escape !,這在 shell 中具有特殊含義。要將其用作 的模式參數的一部分grep,您必須引用它或對其進行轉義。

將整個模式用單引號或雙引號括起來(取決於您的目的)要容易得多,而不是一個一個地引用每個特殊字元,例如:

grep -a -P '"stored": "*123*(?!00)[0-9]{2,5}#"'

另請注意,我替換-E-P,因為負前瞻在擴展正則表達式(?!...)的典型實現中不起作用。grep-P標誌啟用 Perl 正則表達式,它應該支持這一點。

引用自:https://serverfault.com/questions/831293