2008-09-18 82 views
30

如何如果表達式用單引號匹配sed的單引號匹配一個單引號:如何在sed

sed -e '...' 

例如需要將這個文本匹配:

'foo' 
+0

標記[sed]或多或少不正確,因爲問題可能與例如awk沒有任何內容的變化。它應該是'殼',但我不能重複。 – tzot 2008-09-18 09:25:59

+1

@TimB:shell-quoting是一個全新的標籤,並且由於「shell」,「轉義」綽綽有餘。 「逃離」已經使用了幾十年(接近40年),當一個人從他們在殼中的特殊含義中剝離字符...並且問題是關於逃避報價。 – tzot 2008-10-16 00:24:13

回答

43

您可以使用:

"texta'textb" (APOSTROPHE inside QUOTATION MARKs) 

'texta'\''textb' (APOSTROPHE text APOSTROPHE, then REVERSE SOLIDUS, APOSTROPHE, then APOSTROPHE more text APOSTROPHE) 

我使用了unicode字符名稱。 REVERSE SOLIDUS通常被稱爲反斜槓。

在後一種情況下,您關閉您的撇號,然後用引號括起您的撇號,然後爲其餘文本打開另一個撇號。

34

正如在問題的評論中指出的那樣,它並不是真的關於sed,而是如何在引用的字符串中包含引號(例如bash)。

爲了澄清以前的答案,您需要用反斜槓來避免引號,但是您不能在單引號表達式中這樣做。從bash的手冊頁:

圍護字符用單引號 保留引號內的每個字符 的字面意義。單個 報價可能不會發生單個 報價,即使前面有 反斜槓。

因此,您需要終止帶引號的表達式,插入轉義引號並開始一個新的帶引號的表達式。 shell的引用刪除不會添加任何額外的空格,所以實際上你會得到字符串連接。

因此,要回答如何單引號表達「富」原題,你會做這樣的事情:

sed -e '...'\''foo'\''...' 

(其中「......」是的sed表達式的其餘部分)。

總體而言,可讀性的原因,你會好得多改變周圍的引號雙引號如果可能的話:

sed -e "...'foo'..." 

[作爲最早的潛力維護的噩夢的一個例子(單引號)方法,請注意StackOverflow的語法突出顯示如何爲引號,反斜槓和其他文本着色 - 它絕對不正確。]