我试图用
替换%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
答案 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'