sed 字符替换时目标内容包含 & 特殊字符怎么处理

背景

想写一个自动修改配置的脚本,输入一个 mysql jdbc 的连接路径,然后替换目标配置中的模版内容,明明很简单的一个内容,结果卡在了 & 这个符号上。

& 到底是什么特殊字符呢?结论:它代表要替换的旧的字符串。

& 代表什么

在 sed 中 ,& 有特殊含义,但是它不是正则表达式的特殊字符。

脚本接收并替换流程

编写一个脚本 mysql_config.sh ,用来对一个数据库配置文件中的 jdbcUrl 部分进行替换,第一个参数是 URL ,替换过程如下:

bash 复制代码
dbUrl=$2
pathEscaped=$(echo $dbUrl | sed -e 's/\//\\\//g')
pathEscaped=$(echo $pathEscaped | sed -e 's/\&/\\&/g')

originalUrl='jdbc:mysql://IP:port/dbname'
oldEscaped=$(echo $originalUrl | sed -e 's/\//\\\//g')
echo $oldEscaped

sed -i -c "s/$oldEscaped/$pathEscaped/" /myapp/conf/jdbc.properties

脚本注意事项,路径中包含 / 特殊字符,必须转义为 \/ ,第一个转换语句:

bash 复制代码
sed -e 's/\//\\\//g'
sed -e 's/\&/\\&/g')

old 字符串为 /,特殊字符转义为 \/ new 字符串部分是 \/,目标字符串写出转义之后的值就是 \\\/ ,这样才能得到真正要替换的新路径。 & 字符替换为转义后的普通符号 \& ,最终放到目标串中应该是 \\\&

sed -i -c "s/old/new/" 命令执行的时候,如果包含特殊字符,必须都逐个转义,才能得到正确的结果。

相关推荐
prettyxian5 分钟前
【Linux】内核编织术:task_struct的动态网络
linux·运维·服务器
Danileaf_Guo6 分钟前
OSPF路由引入的陷阱:为何Ubuntu上静态路由神秘消失?深挖FRR路由分类机制
linux·运维·网络·ubuntu·智能路由器
张某人的胡思乱想8 分钟前
windows远程ubuntu
linux·运维·ubuntu
QT 小鲜肉10 分钟前
【Linux命令大全】001.文件管理之mtoolstest命令(实操篇)
linux·运维·前端·笔记·microsoft
ocean210315 分钟前
Linux面试题图解
linux·运维·服务器·面试·职场和发展
winfreedoms18 分钟前
wsl ubuntu的基础配置
linux·ubuntu·wsl·基础配置
怎么没有名字注册了啊20 分钟前
Debian 纯命令行 安装 VMware Tools 完整无坑手册(含全报错解决 + 无版本号 / 无成功提示终极修复)
linux·运维·debian·vmwaretools
最后一个bug33 分钟前
浅显易懂的讲解MMU是如何使用4级页表把虚拟地址转化为物理地址的~
linux·服务器·开发语言·系统架构·计算机外设
Hey小孩36 分钟前
[个人总结] Linux设备驱动第三版:2.建立和运行模块-II
linux
debug 小菜鸟38 分钟前
Linux 服务器环境搭建实战:从裸机到可用生产环境(含自动化脚本)
linux·服务器·自动化