2013-02-14 226 views
0

我試圖跨過使用以下命令多個文件sed命令來替換字符串

<ph name='NUMBER' ex='%2$u'/> 

取代%2 $ u臺。

find . -name "*.txt" -print | xargs sed -i 's/%2$u/<ph name='NUMBER' ex='%2$u'\/>/g' 

而實際上%2 $ u被越來越更換這樣

<ph name=NUMBER ex=%2/> 

能有人給我解決?提前致謝。

-Ranjit

回答

0

你不能嵌入一個單引號字符內一個單引號。嘗試:

find . -name "*.txt" -print | 
    xargs sed -i 's/%2$u/<ph name='"'"'NUMBER'"'"' ex='"'"'%2$u'"'"'\/>/g' 

find . -name "*.txt" -print | 
    xargs sed -i "s/%2\$u/<ph name='NUMBER' ex='%2\$u'\/>/g" 

取決於SED的版本,您可能需要逃避$以sed的,以防止它行的唯一匹配的結束:

xargs sed -i "s/%2\\\$u/<ph name='NUMBER' ex='%2\\\$u'\/>/g" 
+0

'$ '無論如何都需要逃避,不是嗎? – 2013-02-14 02:26:48

+0

在單引號字符串內部,您不需要爲shell跳過'$'。如果某個版本的sed沒有出現在模式的末尾,那麼它將不會匹配它,但爲了安全起見,它可能應該轉義爲sed。 – 2013-02-14 02:29:28

0

quoting with single quotes時,下一個單引號結束引用。因此,後者的表達實際上是由以下部分組成:

's/%2$u/<ph name=' 
NUMBER 
' ex=' 
%2$u 
'\/>/g' 

而且不帶引號的部分中,parameter expansion發生。因此,$u正被替換爲參數u的值,或空字符串(如果不存在)。你可以用一個簡單的echo測試:

echo 's/%2$u/<ph name='NUMBER' ex='%2$u'\/>/g' 

爲了避免這種情況,或者使用不同的報價技巧,如G。含有單引號部分雙引號(記得要逃脫它的$,否則發生膨脹):

's/%2$u/<ph name='"'NUMBER'"' ex='"'%2\$u'"'\/>/g' 

或者替換字符串中使用雙引號(如果適用):

's/%2$u/<ph name="NUMBER" ex="%2$u"\/>/g'