如何使用sed删除属性文件指定行并在原位置写入新JAVA_HOME配置
SED替换JAVA_HOME配置实现方案
需求说明
需要修改属性/脚本文件中的JAVA_HOME配置项:删除原有包含JAVA_HOME的整行内容,在原行位置写入新配置JAVA_HOME=/var/tmp/java/jdk11.0.5。
以测试脚本为例,原文件内容:
#!/bin/sh export ORACLE_HOME=/opt/ibm/oracle export JAVA_HOME=/var/tmp/java/java1.8.0.31
修改后需保持其他行内容、行顺序不变,仅替换旧的JAVA_HOME配置行。
具体命令
sed的c命令本身就支持「匹配指定行→整行替换为新内容」的操作,天然符合「删旧行+原位置写新行」的需求,不需要先删再加两次操作,比指定固定行号的方式通用性更强(不会因为文件增删行导致替换位置错误)。
- 预览修改效果(不改动原文件,终端输出修改后的结果,建议先执行确认效果)
sed '/JAVA_HOME=/c\export JAVA_HOME=/var/tmp/java/jdk11.0.5' 目标文件路径
- 原地修改文件(确认效果无误后执行,直接写入原文件)
- Linux系统(默认搭载GNU sed):
sed -i '/JAVA_HOME=/c\export JAVA_HOME=/var/tmp/java/jdk11.0.5' 目标文件路径- macOS系统(默认搭载BSD sed):
sed -i '' '/JAVA_HOME=/c\export JAVA_HOME=/var/tmp/java/jdk11.0.5' 目标文件路径
效果验证
针对给出的示例脚本执行上述命令后,文件内容如下,完全符合要求:
#!/bin/sh export ORACLE_HOME=/opt/ibm/oracle export JAVA_HOME=/var/tmp/java/jdk11.0.5
可选优化
如果文件中存在被注释的JAVA_HOME行(比如# JAVA_HOME=xxx),不希望误改注释内容,可以收紧匹配规则,仅匹配实际生效的配置行:
# 仅匹配行首可能存在空白、带export的生效JAVA_HOME配置 sed '/^[[:space:]]*export[[:space:]]*JAVA_HOME=/c\export JAVA_HOME=/var/tmp/java/jdk11.0.5' 目标文件路径
如果是修改不带export前缀的properties格式配置文件,把替换内容改成JAVA_HOME=/var/tmp/java/jdk11.0.5即可,匹配规则依然适用。
内容的提问来源于stack exchange,提问作者Bob
相关产品推荐
相关产品推荐

