Tool zum Ersetzen von Blöcken in einer Datei

Tool zum Ersetzen von Blöcken in einer Datei

Die meisten Softwaretools zur Konfigurationsverwaltung verfügen über eine Möglichkeit, einen Block in einer Datei zu ersetzen.

Beispiel:

Ich möchte genau das, aber ohne den Overhead dieser großen Tools.

Gibt es ein einfaches Tool zum Aktualisieren und Verwalten eines Blocks in einer Textdatei?

Beispiel: Ich möchte aktualisieren/etc/some-server/some-server.conf

Ich möchte einen Block wie diesen einfügen/aktualisieren:

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

Ich weiß, dass ich dies mit einigen Zeilen Awk oder Python tun kann, aber ich suche ein gebrauchsfertiges Tool.

Antwort1

Sed eignet sich gut zum Ersetzen von Text. Ich habe keine Bash-Shell in der Nähe, um dies zu testen, aber grob gesagt ist der Befehl, den Sie benötigen/bereits zur Hand haben, da ich Ihr Problem nur begrenzt kenne,

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

Es nimmt auch ein Ersatzformat 's/this/that/' an und ist ideal in einer Reihe von Pipe-Befehlen

Antwort2

Wie einfach das ist, hängt davon ab, wie sich das Tool bei nicht-nominalen Bedingungen verhalten soll. Wenn in der Datei immer genau ein Block mit den speziellen Kommentaren vorhanden ist, ist das beispielsweise mit awk recht einfach.

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

Wenn Sie den Block am Ende hinzufügen möchten, sofern er nicht bereits vorhanden ist, ist das trotzdem nicht allzu schwierig:

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

Die Bewältigung anderer Szenarien (z. B. Anfangskommentar vorhanden, aber kein Endkommentar, mehrere Blöcke usw.) wird zunehmend schwieriger.

verwandte Informationen