我試圖跨過使用以下命令多個文件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
我試圖跨過使用以下命令多個文件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
你不能嵌入一個單引號字符內一個單引號。嘗試:
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"
當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'
'$ '無論如何都需要逃避,不是嗎? – 2013-02-14 02:26:48
在單引號字符串內部,您不需要爲shell跳過'$'。如果某個版本的sed沒有出現在模式的末尾,那麼它將不會匹配它,但爲了安全起見,它可能應該轉義爲sed。 – 2013-02-14 02:29:28