ファイル内のブロックを置換するツール

ファイル内のブロックを置換するツール

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

例:

まさにこれが欲しいのですが、これらの大きなツールのオーバーヘッドは不要です。

テキスト ファイル内のブロックを更新および維持するための簡単なツールはありますか?

例: 更新したい/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

これがどれだけ簡単かは、ツールが非標準条件でどのように動作するかによって異なります。ファイル内に特別なコメントを含むブロックが常に 1 つだけある場合は、たとえば 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

その他のシナリオ (開始コメントはあるが終了コメントがない、複数のブロックなど) への対処は、次第に難しくなります。

関連情報