Atualize ou anexe JAVA_HOME com sed

4

Estou fazendo o script da minha nova pilha de VMs e estou tentando atualizar ou anexar JAVA_HOME no arquivo ~/.bashrc

Eu consegui fazer isso executando o seguinte comando sed na linha de comando.

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

No entanto, quando tento executá-lo a partir de um script usando uma variável, estou recebendo o seguinte erro:

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

Descobri que isso é causado pelo fato de meu caminho conter / , que é confundido com o delimitador sed , portanto, mudei para isso:

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

onde $java contém um caminho para o java, mas agora ele não funciona, também não gera nenhuma exceção. Onde eu cometi um erro?

    
por Dawid Adach 03.06.2017 / 21:33

2 respostas

3

Mantendo sua lógica, eu reformei o sed em um formato um pouco compacto, em que a alteração para o JAVA_HOME é feita uma vez no início do sed.

Além disso, há um pouco sobre como escapar da variável java para que ela seja incluída no comando rhs de s/// sed .

Além disso, o 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
    
por 04.06.2017 / 10:40
0

O segundo comando descartou os caracteres " da string de substituição. E eu não entendo o que você está fazendo com o s no final, então que tal:

sed '/export \{1,\}JAVA_HOME=/{h;s#=.*#="'$java'"#};${x;/^$/{s##export JAVA_HOME="'$java'"#;H};x}' -i ~/.bashrc
    
por 03.06.2017 / 22:24