2011-09-22 864 views
46

從我所能找到的,當你使用單引號時,裏面的所有內容都被認爲是文字。我想要替換我的。但我也想找到一個有單引號或雙引號的字符串。如何在SED中轉義雙引號和單引號? (bash)

例如,

sed -i 's/"http://www.fubar.com"/URL_FUBAR/g' 

我想URL_FUBAR取代 「http://www.fubar.com」。 sed應該如何識別我的/或我的雙引號?

感謝您的幫助!

編輯:我可以用s/\"http\:\/\/www\.fubar\.\com\"/URL_FUBAR/g

\實際上轉義單引號內的字符?

回答

59

sed命令允許你改爲其他字符/

sed 's#"http://www.fubar.com"#URL_FUBAR#g' 

The double quo tes不是問題。

+0

偉大的答案dood,我只是有一個簡單的問題。我將如何做單引號來代替我的雙打。我在我的代碼中有單個或雙重的實例我只能運行這個命令兩次,但是轉義單引號的語法是什麼? – KRB

+1

要麼只是切換引號,以便你有,例如,'sed「##http://www.fubar.com'#URL_FUBAR#g」'或轉義單引號'sed的#\'http: //www.fubar.com \'#URL_FUBAR#g''。 – Kusalananda

+0

在製作中的天才 - 非常感謝:) – danday74

-2

可能是 「\」 字符,試試這個:

sed 's/\"http:\/\/www.fubar.com\"/URL_FUBAR/g' 
+1

提出胡亂猜測是不是一個解決方案。你可以在評論中添加這樣的猜測 - 或者甚至更好 - 先試試吧 – SeriousM

-1

您需要使用\ 「轉義」 字符(\躲避後面的字符

sed -i 's/\"http://www.fubar.com\"/URL_FUBAR/g' 
5

我的問題是,我需要有""表達外,因爲我有sed的表達式內的動態變量本身。因此,比實際的解決方案是,從lenn jackman那裏你可以用[\"]代替sed正則表達式中的"

所以我完全是bash:

RELEASE_VERSION="0.6.6" 

sed -i -e "s#value=[\"]trunk[\"]#value=\"tags/$RELEASE_VERSION\"#g" myfile.xml 

這裏是:

#是sed的分隔

[\"] = "在正則表達式

值= \"tags/$RELEASE_VERSION\" =我替換字符串,重要的是它只有\"報價

15

關於單引號,請參閱下面的代碼來替換字符串let'slet us

命令:

echo "hello, let's go"|sed 's/let'"'"'s/let us/g' 

結果:

你好,讓我們去

+7

爲什麼不sed的/讓\ /讓我們/克'工作? – tarunkt

1

轉義雙引號ca在sed中絕對有必要:例如,如果在整個sed表達式中使用雙引號(因爲在使用shell變量時需要執行此操作)。

下面是對SED逃逸倒是一個例子,但也捕獲在bash一些其他的報價問題:

# cat inventory 
PURCHASED="2014-09-01" 
SITE="Atlanta" 
LOCATION="Room 154" 

比方說,你想用sed腳本,您可以用遍地改變房間,所以你variablize輸入如下:

# i="Room 101" (these quotes are there so the variable can contains spaces) 

這個腳本會增加整個行,如果它不存在,或者它會簡單地替換(使用SED)是那裏的文字加價值線$我。

if grep -q LOCATION inventory; then 
## The sed expression is double quoted to allow for variable expansion; 
## the literal quotes are both escaped with \ 
    sed -i "/^LOCATION/c\LOCATION=\"$i\"" inventory 
## Note the three layers of quotes to get echo to expand the variable 
## AND insert the literal quotes 
else 
    echo LOCATION='"'$i'"' >> inventory 
fi 

P.S.我寫了上面的腳本以多行做出的評論解析的,但我把它作爲一個班輪在命令行中,看起來像這樣的:

i="your location"; if grep -q LOCATION inventory; then sed -i "/^LOCATION/c\LOCATION=\"$i\"" inventory; else echo LOCATION='"'$i'"' >> inventory; fi 
0
Prompt% cat t1 
This is "Unix" 
This is "Unix sed" 
Prompt% sed -i 's/\"Unix\"/\"Linux\"/g' t1 
Prompt% sed -i 's/\"Unix sed\"/\"Linux SED\"/g' t1 
Prompt% cat t1 
This is "Linux" 
This is "Linux SED" 
Prompt% 
+0

只使用\(反斜槓)之前「(雙引號)..並使用-i選項 – SachinH

+1

儘管此代碼片段是受歡迎的,並且可能會提供一些幫助,如果它包含解釋, meta.stackexchange.com/q/114762)*如何解決這個問題,如果沒有這個答案,你的答案就沒有什麼教育價值了 - 記住,你正在爲將來的讀者回答問題,而不僅僅是現在的問題!請編輯您的答案以添加解釋,並指出適用的限制和假設。 –