shell中的引號和轉義
- Home
- Programming >Assorted
- shell中的引號和轉義
前言
在學習正則表示式的時候,在shell裡面用egrep
來驗證正則表示式,egrep
的基本語法是egrep [regular expression] [file path]
,結果會返回目標檔案中能匹配到正則表示式的對應行,由於正則表示式中一些元字元在shell中也是有特殊意義的,所以為了能正確匹配,需要用單引號'
把正則表示式包含起來,但是如果正則表示式裡面包含單引號呢,帶著這個問題去查了一下,瞭解了一下shell中的不同的轉義方式。
我的shell用的是Mac上的bash。
bash中的三種不同轉義方式
字元 | 說明 |
---|---|
單引號'
|
又叫硬轉義,其內部所有的shell 元字元、萬用字元都會被關掉。注意,硬轉義中不允許出現'
(單引號)。 |
雙引號"
|
又叫軟轉義,其內部只允許出現特定的shell 元字元:$用於引數代換 `用於命令代替 |
反斜槓\
|
又叫轉義,去除其後緊跟的元字元或萬用字元的特殊意義。 |
假設我們要匹配html
檔案中的lang
為en
或zh
的行,那麼我們可以用這樣的正則lang="(en|zh)"
,如果我們的正則表示式中沒有出現單引號,那麼在shell中用單引號包裹我們的正則表示式是最方便的一種做法'lang="(en|zh)"'
,單引號意味著其中的所有字元都被shell當作普通字元來處理。
但是如果你的html中都是用的單引號<html lang='en'>
,那麼用單引號shell就無法解析命令了,這個時候用雙引號來代替原來的單引號,"lang='(en|zh)'"
來執行,需要注意的是如果使用雙引號的話,$
和`
不是普通字元,所以要在前面加上\
轉義。
或者還有一種方法,就是不用引號,所有的元字元全部用反斜槓轉義,lang=\'\(en\|z。h\)\'
,這樣也可以匹配到正確的文字,但是如果正則表示式比較負責,這樣做就有點麻煩。
總結
因為正則表示式並沒有一個統一的標準,所以在不同的環境和需求中實現都不相同,瞭解當前語言或者環境下正則表示式的語法是使用前必須要做的,比如在emacs
中使用正則表示不能像Perl正則表示式
中直接使用()和|
都需要用\
進行轉義。