我需要在一個小bash腳本內替換文件內的字符串,但是...我得到奇怪的結果。從bash腳本中替換文件中的字符串
比方說,我想替換:
<tag><![CDATA[text]]></tag>
有了:
<tag><![CDATA[replaced_text]]></tag>
我應該使用sed
?我認爲由於/
和[
]
我越來越奇怪的結果...
接觸這個最好的方法是什麼?
我需要在一個小bash腳本內替換文件內的字符串,但是...我得到奇怪的結果。從bash腳本中替換文件中的字符串
比方說,我想替換:
<tag><![CDATA[text]]></tag>
有了:
<tag><![CDATA[replaced_text]]></tag>
我應該使用sed
?我認爲由於/
和[
]
我越來越奇怪的結果...
接觸這個最好的方法是什麼?
是的,你需要跳過括號,並且要麼跳過斜槓或使用不同的分隔符。
sed 's,<tag><!\[CDATA\[text\]\]></tag>,<tag><!\[CDATA\[replaced)text\]\]></tag>,'
這就是說,SGML和XML實際上沒有任何比HTML當談到使用正則表達式;不要期望這個概括。
Perl,以-p選項的作品幾乎一樣SED,它有它的正則表達式\ Q(報價)開關:
perl -pe 's{\Q<tag><![CDATA[text]]></tag>}
{<tag><![CDATA[replaced_text]]></tag>}' YOUR_FILE
而且在Perl中,你可以使用不同的標點符號分隔符你的表情(S {.. 。} {...}在我的例子中)。
這應該是足夠了:
$ echo '<tag><![CDATA[text]]></tag>' | sed 's/\[text\]/\[replaced_text\]/'
<tag><![CDATA[replaced_text]]></tag>
你也可以改變你的/
分離器內的sed到不同的性格像,
,|
或%
。
只需使用比/以外的分隔符,在這裏我使用#:
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的不支持非貪婪乘數(在*?)。
對於'\ Q'爲+1。要結束引用,請對文字字符串使用'\ E' – Gowtham 2012-04-10 17:57:47
+1。如果有人鏈接到如何逃避原始或替換文本以避免嵌入式出現'\ E'或其他特殊序列,這將更加優秀。 – l0b0 2012-04-11 10:04:01