sed +行がすでに存在する場合、追加を無視するようにsedに指示する方法は?

sed +行がすでに存在する場合、追加を無視するようにsedに指示する方法は?

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」以外の順序では決して表示されず、どちらか一方のみが表示されたり、ファイル内の他の場所には表示されません。

おすすめ記事