Linie mit sed oder awk anhängen

786
coverflower

In einem Bash-Skript muss ich eine Zeile in eine systemd-Datei einfügen. Die Datei sieht so aus:

[Unit] ...  [Service] ... 

Die Zeile muss unter dem Abschnitt [Unit] und nach allen Zeilen in diesem Abschnitt angehängt werden:

[Unit] ... ---MY LINE---   [Service] ... 

Ich kann die Zeile direkt nach [Unit] anhängen:

[Unit] ---MY LINE--- ...  [Service] ...  

mit sed wie folgt:

$ sed '/\[Unit\]/a ---MY LINE---' input_file 

aber wie kann ich meine Zeile nach allen Zeilen in der Sektion anhängen?

2

1 Antwort auf die Frage

4
oliv

Wenn Sie GNU awkin Ihrem System haben, können Sie das folgende Skript verwenden. Die Zeichenfolge wird direkt vor dem Beginn des nächsten Abschnitts angehängt.

awk -v RS='\\[[^]]*\\]' '; printf RT; oRT=RT}' input_file 

RSist der Datensatztrenner. Es ist ein Regex, der auf irgendetwas zwischen eckigen Klammern gesetzt ist, so dass er mit [Unit]und übereinstimmt [Service]. Wenn Sie ein solches RSElement haben, können Sie einen Datensatz mit dem vollen Inhalt eines Blockabschnitts erstellen.

RTist der Datensatzabschluss. Es wird dynamisch awkfür jeden Datensatz basierend auf festgelegt RS. Es wird nacheinander [Unit]und halten [Service].

Der Trick besteht darin, den Datensatzabschluss in der Variablen zu speichern oRT. Wenn dieser das Wort Unithat, hängen Sie die gewünschte Zeichenfolge an ---MY LINE---.


Wenn Sie die Zeichenfolge vor der leeren Zeile am Ende des Abschnitts anhängen möchten, verwenden Sie das folgende Skript:

awk -v RS='\\[[^]]*\\]' 'oRT~/Unit/' input_file 

Die subFunktion ersetzt die leere Zeile am Ende des Datensatzes durch Anhängen der gewünschten Zeichenfolge und einer leeren Zeile.

Danke, das ist gut, aber es fügt eine leere Zeile zwischen der letzten Zeile und meiner Zeile des Abschnitts [Unit] ein und sie befindet sich direkt vor [Service] ohne eine leere Zeile dazwischen. Wie kann ich das beheben? coverflower vor 6 Jahren 0
@coverflower Bitte sehen Sie die aktualisierte Antwort oliv vor 6 Jahren 0
Großartig! Vielen Dank. Es funktioniert jetzt perfekt. coverflower vor 6 Jahren 0