0

我试图用 %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/>

有人可以给我解决方案吗?提前致谢。

-兰吉特

4

2 回答 2

0

用单引号引用时,下一个单引号结束引用。所以后一个表达式实际上由以下部分组成:

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

在未引用的部分中,发生了参数扩展$u被参数的值u或空字符串(如果不存在)替换也是如此。你可以用一个简单的方法来测试它echo

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

为避免这种情况,请使用不同的引用技术,例如包含单引号的部分的双引号(记住要转义其中$的,否则会发生扩展):

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

或者在被替换的字符串中使用双引号(如果适用):

's/%2$u/<ph name="NUMBER" ex="%2$u"\/>/g'
于 2013-02-14T02:33:40.897 回答
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"
于 2013-02-14T02:25:19.067 回答