我试图用 %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/>
有人可以给我解决方案吗?提前致谢。
-兰吉特
我试图用 %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/>
有人可以给我解决方案吗?提前致谢。
-兰吉特
当用单引号引用时,下一个单引号结束引用。所以后一个表达式实际上由以下部分组成:
'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'
您不能在单引号字符串中嵌入单引号。尝试:
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"