sedを使用してJAVA_HOMEを更新または追加します。

sedを使用してJAVA_HOMEを更新または追加します。

新しいVMスタックスクリプトを作成し、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

これには$javaJavaへのパスが含まれていますが、今は機能しないか、例外は発生しません。私は何が間違っていましたか?

答え1

あなたのロジックを維持しながら、sedJAVA_HOMEへの変更は、sedの起動時に一度だけ実行されるより簡潔な形式で書き直されました。

rhsまた、コマンドに含めるのに適したJava変数をエスケープする方法もありますs/// sed

しかも -lysedですPOSIX

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

"2番目のコマンドは代替文字列から文字を削除しました。s最後にあなたが何をしているのか理解できません。それではどうですか?

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

関連情報