轉義字符Escape character在正則中的用法
Linux中的轉義字符通常用?\ 標識開始,轉義意味著?\ 后面的字符有特殊的意義,通常是一個控制動作,比如在echo命令中echo -e ?“\a”表示警告,一般情況下能聽到一聲蜂鳴。
在正則中,也有同樣的轉義需求,下面把常用的也是容易混淆的幾個字符一一說明用法。在引入正文之前,請先看這個題目:
用基本和擴展正則找出/etc/rc.d/init.d/functions文件中行首為某單詞(包括下劃線)后面跟一個小括號的行:
基本正則表示:grep “^\([[:alpha:]]\|_\).*()” functions
擴展正則表示:egrep? “^([[:alpha:]]|_).*\(\)” /etc/rc.d/init.d/functions
從中可以看到小擴號()在基本正則中沒有轉義,而在擴展正則中用到了轉義\(\),原因是在基本正則的定義中,\(\)是分組的表達,所以()就表示是擴號的原義,而在擴展正則中,分組是用()來表示,所以()的原義需要\(\)來進行轉義。
對于點號 . 來說,無論在基本還是擴展正則中,都是匹配任意單個字符的特殊意義,所以如果正則表達式中需要點號 . 本來的意義如文件的后綴.txt, .sh時,就需要用 \ 轉義,也可以用[.]來表示。
此外,在使用vim或sed對輸出或文件進行查找替換操作時,如果用到的分割符號是 / , 查找或替換的內容包包含有 / 時,需要做轉義。例子:
需要把一個文件中所有的/etc替換為/conf,如果用s///,轉義如下:
? ? ? ? sed ‘s/\/etc/\/conf/’ file1
可以用更直觀的方法來避免轉義?/ ,如更改為其它分割符@@@或###,這時 / 不需要再轉義:
? ? ? ? sed ‘s@/etc@/conf@’ file1?或sed ‘s#/etc#/conf#’,但是這種情況下,如果查找替換的字符包括分割符@ #,同樣也需要用 \ 來分別進行轉義。
總之,轉義字符的使用比較靈活,總的原則是在語法結構中定義有特殊作用的字符,如果想引用字符本身,都需要用?\?轉義。
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/95854