关于linux sed -i 的一份思考?

当前环境下有一个setting.conf文件 其中的格式如下

# 数据库驱动类型  默认mysql  可选值: mysql/dm
DB_TYPE=mysql
# 数据库 浮动ip 网段保持一致
DB_HOST=10.77.0.28
# 数据库端口 主备保持一致
DB_PORT=8888
# 数据库超管密码
DB_ROOT_PWD=B1LiBIlI@1234

我在脚本中使用cat 和sed 命令将配置文件中的数据分发到不同的配置文件中来达到初始化配置文件的目的
image.png

目前有以下问题:

对于以下特殊字符的配置如果其中包含=号则会从中间截断

如:

PORT_BIMSERVER=edwgvrew=febwui4

期望值是edwgvrew=febwui4 而实际获取值是 edwgvrew

而且如果使用命令

sed -i "s/{PORT_BIMSERVER}/$PORT_BIMSERVER/g" ${INSTALL_PATH}/iam-docker/bim-compose/bim/conf/server.xml

PORT_BIMSERVER中如果包含"/"的话则会报错

这里一个这种的方法是 使用,代替分隔符,美中不足就是如果替换的内容包含所有的特殊字符

~!@#$%^&*():>?""{}的话就需要用转义符来转义了 \=

请问有什么好的实现吗

阅读 1.5k
1 个回答
对于以下特殊字符的配置如果其中包含=号则会从中间截断

换成 cut 就好了

PORT_BIMSERVER=$(echo PORT_BIMSERVER=edwgvrew=febwui4 | cut -d '=' -f 2-)
echo $PORT_BIMSERVER
PORT_BIMSERVER中如果包含"/"的话则会报错

这个也好处理,把 / 换成 \/ 就好了

PORT_BIMSERVER=$(echo PORT_BIMSERVER=a=6/ | cut -d '=' -f 2-)
echo $PORT_BIMSERVER
echo ${PORT_BIMSERVER//\//\\/}

还有一个比较偏门的方法:
sed 能够用特殊的字符做分隔符,例如 sed "s^["target^[replace^[g,在控制台同时按下 ctrl+v+3

或者是

d=$'\03'
sed "s${d}$var${d}replace$d" file

来源,stackoverflow: how-to-pass-a-variable-containing-slashes-to-sed

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏