sed替换含有路径的字符串

问题描述

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 也同样支持

Licensed under CC BY-NC-SA 4.0
Built with Hugo
主题 StackJimmy 设计