Linux下使用sed替换文件中${user.home}字符串失败求助
解决sed替换${user.home}失败的问题
我来帮你搞定这个sed替换的坑!你之前的命令失效主要是没处理好shell的变量解析和sed正则的特殊字符转义这两个核心点,下面给你详细拆解:
为什么之前的命令都不行?
咱们逐个分析你尝试的命令:
sed -i "s/$${user.home}/r_str/g" 1.xml:双引号里的${user.home}会被shell当成变量解析,如果你没定义这个变量,它就会变成空字符串,sed实际收到的命令是s$/r_str/g,完全偏离了你的需求。sed -i "s/${user.home}/r_str/g" 1.xml:和上面同理,shell解析${user.home}为空,sed执行的是s//r_str/g——这是替换空字符,自然不会有任何效果。sed -i "s/\$\{user\.home\}/r_str/g" 1.xml:双引号里的\$会被shell转成$,所以sed实际拿到的是s/${user\.home}/r_str/g,而sed的基本正则里${...}是表示重复次数的特殊语法,不是匹配字面量的${user.home},所以匹配失败。
正确的替换命令
直接用下面两个命令中的任意一个即可:
方法1:转义分隔符/
sed -i 's/\$\{user\.home\}/\/dev/g' 1.xml
方法2:换用其他分隔符(更简洁)
因为替换目标是/dev,里面的/和sed默认的分隔符冲突,咱们可以换成#作为分隔符,这样不用转义/,看起来更清爽:
sed -i 's#\$\{user\.home\}#/dev#g' 1.xml
关键要点说明
- 用单引号包裹sed脚本:单引号会阻止shell解析里面的
$、{}等特殊字符,确保sed拿到的是你真正想要匹配的字面量。 - 转义sed正则的特殊字符:在sed的基本正则中,
$(行尾标记)、{}(重复次数标记)、.(任意字符匹配)都是特殊元字符,必须用\转义才能匹配它们的字面意义。
执行完上面的命令后,你的1.xml内容就会变成期望的结果:
内容的提问来源于stack exchange,提问作者Jitesh Sojitra
相关产品推荐
相关产品推荐

