2012-04-09 114 views
1

我需要在一個小bash腳本內替換文件內的字符串,但是...我得到奇怪的結果。從bash腳本中替換文件中的字符串

比方說,我想替換:

<tag><![CDATA[text]]></tag> 

有了:

<tag><![CDATA[replaced_text]]></tag> 

我應該使用sed?我認爲由於/[]我越來越奇怪的結果...

接觸這個最好的方法是什麼?

回答

3

是的,你需要跳過括號,並且要麼跳過斜槓或使用不同的分隔符。

sed 's,<tag><!\[CDATA\[text\]\]></tag>,<tag><!\[CDATA\[replaced)text\]\]></tag>,' 

這就是說,SGML和XML實際上沒有任何比HTML當談到使用正則表達式;不要期望這個概括。

4

Perl,以-p選項的作品幾乎一樣SED,它有它的正則表達式\ Q(報價)開關:

perl -pe 's{\Q<tag><![CDATA[text]]></tag>} 
      {<tag><![CDATA[replaced_text]]></tag>}' YOUR_FILE 

而且在Perl中,你可以使用不同的標點符號分隔符你的表情(S {.. 。} {...}在我的例子中)。

+1

對於'\ Q'爲+1。要結束引用,請對文字字符串使用'\ E' – Gowtham 2012-04-10 17:57:47

+0

+1。如果有人鏈接到如何逃避原始或替換文本以避免嵌入式出現'\ E'或其他特殊序列,這將更加優秀。 – l0b0 2012-04-11 10:04:01

0

這應該是足夠了:

$ echo '<tag><![CDATA[text]]></tag>' | sed 's/\[text\]/\[replaced_text\]/' 
<tag><![CDATA[replaced_text]]></tag> 


你也可以改變你的/分離器內的sed到不同的性格像,|%

0

只需使用比/以外的分隔符,在這裏我使用#:

sed -i 's#<tag><!\[CDATA\[text\]\]></tag>#<tag><![CDATA[replaced_text]]></tag>#g' filename 

-i擁有的,而不是打印出來的sed變化的文件。 g用於匹配不止一次(全局)。

但是你知道你想要匹配的確切字符串,標籤和文本嗎? 舉例來說,如果你要替換所有與你replaced_text文字:

perl -i -pe 's#(<tag><!\[CDATA\[)(.*?)(\]\]></tag>)#\1replaced_text\3#g' filename 

切換到perl,因爲sed的不支持非貪婪乘數(在*?)。