在sed命令中有許多的字符都被轉義,比如\ , $, ^,單雙引號還有點號等等,因此使用sed命令進行字符串的匹配和修改的時候,字符串中如果含有轉義字符,很多情況下不能直接用字符本身表示。這時候可以使用反斜杠加上轉義字符的方法來輸出含轉義字符的字符串,但這一方法並不是對所有的轉義字符都有用,過程也較復雜。下面一一說明:
一般而言sed命令格式由三部分組成,sed + 功能選項 + 條件選項,功能選項由連接符號-加上代表不同功能的字母構成,條件選項表明對文本的篩選和處理條件,一般括在單引號或者雙引號中。但兩種引號在sed命令處理的過程中略有不同:
單引號:對其中的內容不做任何處理,即引號內的內容是sed命令定義的格式,對於在條件選項中使用的轉義字符需要使用反斜杠加轉義字符才能輸出。例如:
若定義變量 temp=/home/test/, var=aa
>e cho $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'
這里我們使用#來代替/當分隔符,因此/不再具有轉義功能,無需再加反斜杠來辨識。同樣可以得到上面的輸出效果。分隔符對單引號和雙引號作用一樣。
若字符串中含有單引號,有的時候會發現加反斜杠還是得不到想要的字符串輸出。比較簡單的一個做法是字符串中有單引號時,功能選項部分用雙引號括起來,這樣不用加反斜杠可以直接輸出字符。例如:
> e cho $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命令中的轉義字符還有許多問題需要注意,需要根據具體情況采取不同的輸出方法來解決問題。