exec
ランチャーファイルの一致語の前に次の行を追加したいと思います。
export JAVA_HOME=/usr/jdk64/jdk1.8.0_112
export PATH=$PATH:$JAVA_HOME/bin
ランチャーファイル
more launcher
.
.
.
exec "$(dirname "$0")/launcher.py" "$@"
だから私たちは次のsedラインを生成します
sed -i '/^exec/i export JAVA_HOME=/usr/jdk64/jdk1.8.0_112\nPATH=${JAVA_HOME}/bin:$PATH' launcher
問題は、上記のsed行を2回目または3回目に実行すると、sedが新しい行を追加して、次のように重複する行が発生することです。
export JAVA_HOME=/usr/jdk64/jdk1.8.0_112
PATH=${JAVA_HOME}/bin:$PATH
export JAVA_HOME=/usr/jdk64/jdk1.8.0_112
PATH=${JAVA_HOME}/bin:$PATH
exec "$(dirname "$0")/launcher.py" "$@"
行がすでに存在する場合、追加を無視するようにsedに指示できますか? 、(またはPerl Onelinerを使用)
1つのオプションは、次の方法を使用してラインをきれいにすることです。
sed -i '/JAVA_HOME/d' launcher
それから
sed -i '/^exec/i export JAVA_HOME=/usr/jdk64/jdk1.8.0_112\nPATH=${JAVA_HOME}/bin:$PATH' launcher
しかし、上記のsed行でこれを行うことができるかどうかを知りたいです。
答え1
実行行を「exec」に単純化し、前に追加の行(エクスポートを含む)を「pre1」および「pre2」と呼びます。
/pre1/の2行を予約済みスペースにロードして、「スキップ」して「empty」コマンドを実行できますb
。
sed '/pre1/{N;N;b};/exec/ipre1\npre2'
これにより、/exec/
一致するものがない場合にのみコマンドが実行されます。/pre1/
もちろん、あなたが持っていると仮定
pre1
pre2
exec
そうでなければ
exec
「pre1」または「pre2」以外の順序では決して表示されず、どちらか一方のみが表示されたり、ファイル内の他の場所には表示されません。