使用sed将'替换为转义\'时命令失效,如何正确实现该替换需求?
正确sed命令实现方案
原命令失效原因
你写的命令无法生效是因为shell的引号解析规则:单引号包裹的字符串内,所有特殊字符都会失去特殊含义,也无法通过\转义单引号本身,你写的sed 's/\'/\\\'/g在shell解析阶段就会被拆成不完整的参数,根本无法把你预期的替换规则传给sed执行。
可用的三种写法
写法1:用双引号包裹sed规则(最易理解)
双引号内可以正常转义单引号,注意多转义一层反斜杠适配shell的解析规则:
sed "s/'/\\\'/g"
测试示例:
echo "abcd'efgh\ ijkl\ mnop" | sed "s/'/\\\'/g" # 输出:abcd\'efgh\ ijkl\ mnop
写法2:单引号分段拼接(不用怕shell解析变量)
如果要避免双引号内shell自动解析变量、特殊字符的问题,可以用分段拼接的方式写单引号规则:
sed 's/'\''/\\'\''/g'
原理是把规则拆为多段拼接,最终传给sed的规则和预期完全一致。
写法3:用十六进制编码匹配(避开引号冲突,不容易写错)
直接用单引号的ASCII十六进制编码\x27代替字面量单引号,完全不用处理shell层面的引号转义冲突:
sed 's/\x27/\\\x27/g'
内容的提问来源于stack exchange,提问作者an0nhi11
相关产品推荐
相关产品推荐

