我正在编写新的虚拟机堆栈脚本,并尝试更新或追加到文件JAVA_HOME
中~/.bashrc
sed
我已经通过从命令行运行以下命令成功地做到了这一点。
sed '/export[ ]JAVA_HOME=/{h;s/=.*/='"updatedJava"'/};${x;/^$/{s//export JAVA_HOME='"newJava"'/;H};x}' -i ~/.bashrc
但是,当我尝试使用变量从脚本运行它时,出现以下错误:
sed:-e 表达式 #1,字符 34:“s”的未知选项
我发现这是由于我的路径包含/
与分隔符混淆而引起的sed
,因此我将其更改为:
sed '/export[ ]JAVA_HOME=/{h;s#=.*#='$java'#};${x;/^$/{s##export JAVA_HOME='$java'#;H};x}' -i ~/.bashrc
其中$java
包含java的路径,但是现在它不起作用,它也不会抛出任何异常。我哪里做错了?
答案1
保持你的逻辑,我sed
以稍微紧凑的形式重新编写了,其中,对 JAVA_HOME 的更改在 sed 的开头完成一次。
另外,还有一些关于转义 java 变量的内容,以便它适合包含在rhs
命令中s///
sed
。
另外,sed
是POSIX
-ly。
java_esc=$(printf '%s\n' "$java" | sed -e 's|[\&/]|\\&|g;$!s/$/\\/')
sed -i.BAK -e '
1{
x
s/.*/export JAVA_HOME='"$java_esc"'/
x
}
# assuming the JAVA_HOME declaration does not span line boundaries
/^[[:blank:]]*export[[:blank:]]\{1,\}JAVA_HOME=/{
g
x
s/^/\
/
x
}
${
x
/^\n/!H
x
}
' ~/.bashrc
答案2
第二个命令已删除"
替换字符串中的字符。我不明白你s
最后在做什么,那么怎么样:
sed '/export \{1,\}JAVA_HOME=/{h;s#=.*#="'$java'"#};${x;/^$/{s##export JAVA_HOME="'$java'"#;H};x}' -i ~/.bashrc