sed命令替换字符串

时间:2013-02-14 02:18:51

标签: linux

我试图用

替换%2 $ u
 <ph name='NUMBER' ex='%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

2 个答案:

答案 0 :(得分: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"

答案 1 :(得分: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'