linux sed 替换,使用变量,变量中含有特殊字符的处理
文件 test.sh 内容如下:
#!/bin/bash export JAVA_HOME=/data/jdk_1.9.0 echo $JAVA_HOME
想把 JAVA_HOME = 后面的内容替换为其它内容,这里选择使用 sed 整行替换。
一种写法如下:
#!/bin/bash set -x java_home=$(cat test.sh | grep -n "JAVA_HOME=") line=$(echo $java_home | awk -F ":" '{print $1}') text=$(echo $java_home | awk -F ":" '{print $2}') java_home_new=${text%%=*}=/data/jdk_1.9.0 h="'"; cmd="sed -i ${h}${line}c ${java_home_new}${h} test.sh" eval ${cmd}
说明:
1. 先用 grep -n 获得要替换的行号和内容
2. 用 awk 分别获得行号 line 和内容 text
3. 内容 text = 后面替换为新内容 /data/jdk_1.9.0
4. sed 要替换的变量里有空格和特殊字符 '/',所以先拼成 cmd,再用 eval 执行