用sed更新或附加JAVA_HOME

我正在编写新的VM堆栈脚本,我正在尝试在〜/ .bashrc文件中更新或附加JAVA_HOME

我已经设法通过从命令行运行以下sed命令来做到这一点.

sed '/export[ ]JAVA_HOME=/{h;s/=.*/='"updatedJava"'/};${x;/^$/{s//export JAVA_HOME='"newJava"'/;H};x}' -i ~/.bashrc

但是,当我尝试使用变量从脚本运行它时,我收到以下错误:

sed: -e expression #1, char 34: unknown option to `s’

我发现它是由于我的路径包含/与sed分隔符混淆的事实引起的,因此我将其更改为:

 sed '/export[ ]JAVA_HOME=/{h;s#=.*#='$java'#};${x;/^$/{s##export JAVA_HOME='$java'#;H};x}' -i ~/.bashrc

其中$java包含java的路径,但是现在它不起作用,它也不会抛出任何异常.我在哪里弄错了?

最佳答案
保持你的逻辑,我以一种稍微紧凑的形式重新制作了sed,其中,在sed开始时对JAVA_HOME进行了一次更改.

另外,还有一些关于转义java变量的内容,以便它适合包含在s /// sed命令的rhs中.

另外,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

转载注明原文:用sed更新或附加JAVA_HOME - 代码日志