问题描述
sed -i "s/old/new/g" file.txt
如果 new
是个路径,即字符串中含有/
,这么执行会报错
初级思路
把 new
中的 /
进行转义
比如 new
为 /home/users/config.yaml
替换时
sed -i "s/old/\/home\/users\/config.yaml/g" file.txt
如果 new
是变量,
new="/home/users/config.yaml"
new_sed=$(echo $new | sed -e 's/\//\\\//g')
sed -i "s/old/${new_sed}/g" file.txt
更好的解决方案
转义会降低可读性,只需用其他特殊字符作为sed
表达式的“分隔符”(取代默认的/
)即可。
例如:sed 's#\$CONFIG#/home/users/config.yaml#g'
,使用#
代替/
从而避免大量转义。
你可以尝试一下 echo aabbccdd | sed 's#aa#bb#g' | sed 's?bb?cc?g' | sed 's@cc@dd@g' | sed 's%dd%ee%g'
用任意字符作间隔
这是 sed
命令方便用户的一个特性,vim
中的 :s
也同样支持