Bash中无需新建变量实现参数展开替换?适配sed命令修改IP
解决Bash脚本中IP:Port变量的部分替换问题
可以直接用Bash的参数展开实现需求,无需修改原变量,同时解决sed匹配异常的问题,分两种场景处理:
场景1:端口不含.10.(大多数情况适用)
直接对原变量做局部字符串替换,生成修改后的临时值,再配合转义后的原变量做sed精确替换:
# 原变量 ipp="192.168.10.35:12346" # 生成修改后的IP:Port(仅替换IP部分的.10.为.130.) modified_ipp="${ipp/.10./.130.}" # 转义原变量中的.和:,避免sed将其当作正则特殊字符 escaped_ipp=$(printf '%s' "$ipp" | sed 's/[.:]/\\&/g') # 执行sed替换(假设要修改的文件是config.txt) sed -i "s/${escaped_ipp}/${modified_ipp}/g" config.txt
场景2:端口可能包含.10.(更安全的写法)
如果端口存在类似10010这种包含10的情况,可先拆分IP和端口,单独修改IP部分再组合:
ipp="192.168.10.35:10010" # 拆分IP和端口 ip_part="${ipp%%:*}" # 提取冒号前的IP部分 port_part="${ipp##*:}" # 提取冒号后的端口部分 # 修改IP部分的.10.为.130. modified_ip="${ip_part/.10./.130.}" # 组合成新的IP:Port modified_ipp="${modified_ip}:${port_part}" # 转义原变量做精确匹配 escaped_ipp=$(printf '%s' "$ipp" | sed 's/[.:]/\\&/g') # 执行sed替换 sed -i "s/${escaped_ipp}/${modified_ipp}/g" config.txt
原sed匹配异常的原因
你之前的sed语句匹配异常,是因为IP中的.在sed正则表达式里是匹配任意单个字符的特殊符号,直接用$ipp作为匹配模式时,会误匹配到类似192x168y10z35:12346的内容。转义原变量里的.和:后,sed才会把它们当作普通字符精确匹配。
示例验证
- 原文件内容(config.txt):
server_addr = 192.168.10.35:12346 backup_addr = 192.168.10.36:12346
- 执行脚本后期望结果:
server_addr = 192.168.130.35:12346 backup_addr = 192.168.10.36:12346
内容的提问来源于stack exchange,提问作者DenisZ
相关产品推荐
相关产品推荐

