Linux
在 grep 正則表達式中轉義特殊字元
我正在嘗試在文件上執行 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 正則表達式,它應該支持這一點。