Sed命令中含有轉義字元的解決方法

2021-08-13 19:37:17 字數 2106 閱讀 5162

在sed命令中有許多的字元都被轉義,比如\ , $, ^,單雙引號還有點號等等,因此使用sed命令進行字串的匹配和修改的時候,字串中如果含有轉義字元,很多情況下不能直接用字元本身表示。這時候可以使用反斜槓加上轉義字元的方法來輸出含轉義字元的字串,但這一方法並不是對所有的轉義字元都有用,過程也較複雜。下面一一說明:

一般而言sed命令格式由三部分組成,sed + 功能選項 + 條件選項,功能選項由連線符號-加上代表不同功能的字母構成,條件選項表明對文字的篩選和處理條件,一般括在單引號或者雙引號中。但兩種引號在sed命令處理的過程中略有不同:

單引號:對其中的內容不做任何處理,即引號內的內容是sed命令定義的格式,對於在條件選項中使用的轉義字元需要使用反斜槓加轉義字元才能輸出。例如:

若定義變數 temp=/home/test/, var=aa

>echo $temp | sed 's/\//$var/g'

輸出結果為:

$varhome$vartest$var

你可能會發現並不是所有的轉義字元都需要加反斜槓來輸入(如上例中的$符號),這取決於轉義字元在條件選項中的位置,如果在這個位置字元本身轉義起作用,則需要加反斜槓。即sed命令先檢查字元轉義功能是否成立,若有轉義功能則使用轉義功能,否則按字元輸出。如果你想要輸出該字元時不確定該字元是否會轉義,可以對所有位置新增反斜槓。

雙引號:會對其中的變數進行直接轉換,同樣是上例,如果寫成:

>echo $temp | sed 「s/\//$var/g」

則輸出結果為:

aahomeaatestaa

可以看出雙引號將變數名直接替換成變數內容。

要想使用單引號得到上面雙引號的輸出結果也是可以做到的,這時候需要對變數名加單引號來處理:

>echo $temp | sed 's/\//'$var'/g'

同樣可以得到輸出結果為:aahomeaatestaa

對於sed命令,如上例單引號命令

>echo $temp | sed 's/\//$var/g'中,我們對斜槓符號的輸出加上了反斜槓,以免被sed命令視為轉義字元功能。我們還可以採用另一種方法無需使用加反斜槓來輸出斜槓字元。在這個命令中,分隔符使用了斜槓(/),因此斜槓預設轉義,sed中是可以使用其他符號作為分隔符的,如果不使用斜槓作為分隔符,則斜槓預設無轉義功能,這時就不需要借助反斜槓來輸出了:

>echo $temp | sed 's#/#'$var'#g'

這裡我們使用#來代替/當分隔符,因此/不再具有轉義功能,無需再加反斜槓來辨識。同樣可以得到上面的輸出效果。分隔符對單引號和雙引號作用一樣。

若字串中含有單引號,有的時候會發現加反斜槓還是得不到想要的字串輸出。比較簡單的乙個做法是字串中有單引號時,功能選項部分用雙引號括起來,這樣不用加反斜槓可以直接輸出字元。例如:

>echo $temp | sed "s#/#'

#g"

輸出結果為:

'home'test'

同理上例如果寫成:

>echo $temp | sed 's#/#\'

#g'

,則會報錯。因為單引號需要成對出現,否則sed命令無法知道第乙個單引號究竟與第二個還是第三個單引號匹配。

若字串中含有雙引號時,功能選項部分用單引號括起來,也可以不使用反斜槓來輸出雙引號。

>echo $temp | sed 's#/#"

#g'輸出結果為:

"home"test"

但是,與單引號不同的是,上例如果寫成:

>echo $temp | sed "s#/#\"

#g",卻不會報錯。這也就很好的解決了如果字串中同時有單雙引號的時候該如何處理的問題。

在更加複雜的文字情況中,sed命令中的轉義字元還有許多問題需要注意,需要根據具體情況採取不同的輸出方法來解決問題。

插入和更新資料庫時字串中含有轉義字元的處理方法

在進行更新mysql資料庫的一張表時,提示轉義字元附近錯誤。string resume this is a test content test some case.string sqlcommand insert into table1 values name resume 錯誤原因分析 通過捕獲的...

mysql 字串中含有引號的解決方法

當查詢的字元如圖所示,字串中帶有單引號,此時查詢語句應當為select from table name where name hye 如果不帶 則會報錯,此處是將單引號轉義。使用python 實現如下 a hye print a 輸出 hye a a.replace print a 輸出 hye s...

Java URL中含有漢字引數的解決方法

servlet使用了utf 8的characterencodingfilter對引數統一編碼,jsp頁面encoding utf 8 或gb2312也可用,頁面href js中拼接的url均直接用utf 8編碼的漢字作引數。在伺服器端通過下述 獲取utf 8編碼的漢字字串。string para n...