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

おすすめ記事