冗長sed代替保護

冗長sed代替保護

これはアーキテクチャの問題に近いです。

sedファイルでいくつかの置換/追加を実行するスクリプトがあります。たとえば、次のようになります。

sed -i 's/MY_VAR = 1000/MY_VAR = 1000\nMY_VAR2 = 500/' file.txt

うまく動作しますが、やや大きなスクリプトの一部なので、誰かが^C最初にスクリプトを実行して再実行したり、N回連続して再実行したりすると、同様の結果が出ることがあります。

MY_VAR = 1000
MY_VAR2 = 500
MY_VAR2 = 500
MY_VAR2 = 500
MY_VAR2 = 500
...

これは予期しないことかもしれません。だから私の質問は:これを避けるための最良の方法は何ですか?私は次のことを思い出しました。

if [ ! -f file.txt~copy ]
then
    cp file.txt file.txt~copy
    sed -i 's/MY_VAR = 1000/MY_VAR = 1000\nMY_VAR2 = 500/' file.txt
fi

どちらがうまくいくはずですが、これを達成するためのより良い/推奨方法があるかどうか疑問に思います。ファイルが非常に大きく、touch保護のためにファイルをコピーしたい場合は、上記の内容は明らかに問題になる可能性があります。

ベストアンサー1

これは簡単に拡張できないため、実際のユースケースに適している場合とそうでない場合がありますが、追加したい行がすでに存在することを確認し、存在しない場合にのみ追加できます。

sed '
  /^MY_VAR = 1000$/ {
    $ b a
    N
    /\nMY_VAR2 = 500$/! s/\n/&MY_VAR2 = 500\
/
    b
    :a a \
MY_VAR2 = 500
  }'

MY_VAR = 1000ここで正しい行を見つけると、次のようになります。

  • $最後の()行の場合は、ラベルを見つけて出力のb末尾に追加します。aaMY_VAR2 = 500

  • N追加されたext行の後のパターンスペースが!()の後の改行文字で終わらない場合、埋め込まれた改行文字は改行文字++改行文字MY_VAR2 = 500に置き換えられます。その後、スクリプトの実行を避けるために、スクリプトの最後まで実行します。コマンドも追加してください);MY_VAR2 = 500b

  • そうでなければ、私たちは何もしません。

おすすめ記事