使用 sed 更新或附加 JAVA_HOME

使用 sed 更新或附加 JAVA_HOME

我正在编写新的虚拟机堆栈脚本,并尝试更新或追加到文件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

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

相关内容