新しい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
これには$java
Javaへのパスが含まれていますが、今は機能しないか、例外は発生しません。私は何が間違っていましたか?
答え1
あなたのロジックを維持しながら、sed
JAVA_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