ファイルのブロックを置き換えるツール

ファイルのブロックを置き換えるツール

ほとんどの構成管理ソフトウェアツールには、ファイルのブロックを置き換える方法があります。

例:

私はこれらの大きなツールのオーバーヘッドなしでこれを正確に望んでいました。

テキストファイルのブロックを更新して維持する簡単なツールはありますか?

例:更新したいです。/etc/some-server/some-server.conf

次のようなブロックを挿入/更新したいと思います。

## start my-block
key1=value1
key2=value2
## end my-block

私はawkやPythonをいくつかの行でこれを行うことができることを知っていますが、あらかじめ作成されたツールを検索しました。

答え1

Sedはテキストの交換に適しています。これをテストするためにbashシェルにアクセスすることはできません。

sed '/in lines containing this/cut this/paste this/' in.file >out.file

また、代替 "s/this/that/" 形式を使用し、一連のパイプコマンドに最適です。

答え2

これがどれほど簡単かは、ツールが非名目条件でどのように機能するかによって異なります。ファイルに常に特別なコメントがあるブロックがある場合は、awkを使用すると十分簡単です。

awk '
    /^## end my-block$/ {skip=0}
    !skip {print}
    /^## start my-block$/ {skip=1; system("cat new-block-content") || exit(1)}
' </etc/some-server/some-server.conf >/etc/some-server/some-server.conf.new &&
mv /etc/some-server/some-server.conf.new /etc/some-server/some-server.conf

そのブロックがまだない場合、最後に追加しようとしてもそれほど難しくありません。

awk '
    /^## end my-block$/ {skip=0}
    !skip {print}
    /^## start my-block$/ {skip=1; system("cat new-block-content") || exit(1)}
    END {print "## start my-block"; system("cat new-block-content") || exit(1); print "## end my-block"}
' </etc/some-server/some-server.conf >/etc/some-server/some-server.conf.new &&
mv /etc/some-server/some-server.conf.new /etc/some-server/some-server.conf

他のシナリオ(例:開始コメントはありますが、終了コメントがない、または複数のブロック...)を処理することがますます困難になっています。

関連情報