Zeile(N) nach bestimmter Zeile einfügen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
DerMathias
Beiträge: 46
Registriert: 09.11.2020 15:21:18

Zeile(N) nach bestimmter Zeile einfügen

Beitrag von DerMathias » 26.05.2022 13:30:33

Hallo, ich bin gerade dabei, eine Art Post-Install-Skript zu schreiben...und bin ein kompletter Anfänger darin...

Aus

Code: Alles auswählen

iface eno1 inet dhcp
der /ect/network/interfaces (hier nur ein Auszug!)

kann ich das "dhcp" austauschen durch "static" durch die Anwendung von sed

Code: Alles auswählen

sudo sed -i 's/dhcp/static/gI' /etc/network/interfaces
Soweit so gut. Nun möchte ich aber DANACH (und es ist NICHT das Ende der Datei!) einige Zeilen einfügen.
Ich könnte per

Code: Alles auswählen

sudo echo -e "\taddress xxx.yyy.xxx.yyy" >> /etc/network/interfaces
sudo echo -e "\tnetmask xxx.yyy.xxx.yyy" >> /etc/network/interfaces
sudo echo -e "\tgateway xxx.yyy.xxx.yyy" >> /etc/network/interfaces
(die IP-Adressen sind natürlich hier nur Platzhalter ;-) )

Zeilen am Ende der Datei anfügen, aber ich hätte sie gerne direkt NACH dem oben geänderten "static" in jeweils neuen Zeilen (und mit Tabs eingerückt).

Frage 1: Wäre es schlimm und täte es funktionieren, wenn ich die IP-Sachen ans Ende der Datei stelle, also NACH

Code: Alles auswählen

# This is an autoconfigured IPv6 interface
iface eno1 inet6 auto
, oder ist die Reihenfolge wichtig?

Frage 2: wie würde ich denn "mittendrin" 3 Zeilen am besten einfügen können?

Anbei noch die /etc/network/interfaces, so wie sie nach der minimal-Debian-Installation bei mir rauskommt:

Code: Alles auswählen

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug eno1
iface eno1 inet dhcp

# This is an autoconfigured IPv6 interface
iface eno1 inet6 auto

Dankeschön
Hektik? Dafür habe ich keine Zeit!

Benutzeravatar
Livingston
Beiträge: 1454
Registriert: 04.02.2007 22:52:25
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: 127.0.0.1

Re: Zeile(N) nach bestimmter Zeile einfügen

Beitrag von Livingston » 26.05.2022 14:31:26

Zu Frage 2: Einfügen mehrerer Zeilen nach einem Suchbegriff geht mit:

Code: Alles auswählen

sed '/SUCHBEGRIFF/a neuerKram1\
neuerKram2\
neuerKram3' ${DATEINAME}
a steht für Append/Anhängen (nach einem Suchbegriff). Die einzufügenden Zeilen müssen mit "\" abgeschlossen werden.

Für den Suchbegriff nimmst Du am besten die vollständige, vorgegebene Zeile, also in etwa so:

Code: Alles auswählen

sed -i '/iface\ eno1\ inet\ static/a \
\taddress xxx.yyy.xxx.yyy \
\tnetmask xxx.yyy.xxx.yyy \
\tgateway xxx.yyy.xxx.yyy' /etc/network/interfaces
Hier noch Links auf einen erschlagenden sed-Crashkurs mit Fundstelle für Dein Problem: https://www.grymoire.com/Unix/Sed.html#uh-40 (Einfügen) und https://www.grymoire.com/Unix/Sed.html#uh-44 (Einfügen mehrerer Zeilen)
Der Hauptunterschied zwischen etwas, was möglicherweise kaputtgehen könnte und etwas, was unmöglich kaputtgehen kann, besteht darin, dass sich bei allem, was unmöglich kaputtgehen kann, falls es doch kaputtgeht, normalerweise herausstellt, dass es unmöglich zerlegt oder repariert werden kann.
Douglas Adams

Benutzeravatar
DerMathias
Beiträge: 46
Registriert: 09.11.2020 15:21:18

Re: Zeile(N) nach bestimmter Zeile einfügen

Beitrag von DerMathias » 26.05.2022 14:54:56

Perfekt, danke Dir!
Funktioniert wie gewünscht ...
Links sind mal gespeichert....gibt noch viel zu lernen :-)
Danke
Mathias
Hektik? Dafür habe ich keine Zeit!

tobo
Beiträge: 1996
Registriert: 10.12.2008 10:51:41

Re: Zeile(N) nach bestimmter Zeile einfügen

Beitrag von tobo » 26.05.2022 15:29:49

Würde sich dann ja vielleicht anbieten, das alles zusammen in eine z.B. postinstall.sed-Datei zu schreiben

Code: Alles auswählen

/^(iface.*inet )dhcp/ {
s//\1static/
a\
	address xxx.yyy.xxx.yyy\
	netmask xxx.yyy.xxx.yyy\
	gateway xxx.yyy.xxx.yyy
}
und dann wie folgend (zum Speichern # vor -i entfernen) aufzurufen:

Code: Alles auswählen

# sed -Ef postinstall.sed /etc/network/interfaces #-i

Benutzeravatar
DerMathias
Beiträge: 46
Registriert: 09.11.2020 15:21:18

Re: Zeile(N) nach bestimmter Zeile einfügen

Beitrag von DerMathias » 27.05.2022 08:24:13

Gefällt mir :-)
Jetzt muss ich nur noch die Syntax vollends verstehen, aber wird schon.
Die Links von Livingston werden sicher helfen...

Danke
Hektik? Dafür habe ich keine Zeit!

Benutzeravatar
Livingston
Beiträge: 1454
Registriert: 04.02.2007 22:52:25
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: 127.0.0.1

Re: Zeile(N) nach bestimmter Zeile einfügen

Beitrag von Livingston » 27.05.2022 14:39:15

Kurze Antwort zu dem Skript:
/^(iface.*inet )dhcp/ ist der Suchbegriff, aber etwas verallgemeinert:
1. ^ Zeilenanfang, d.h. die Zeile beginnt mit iface (zu den Klammern kommen wir später)
2. .* Es folgen danach beliebig viele Zeichen und das Wort "inet " (mit Leerzeichen)
3. Die Suche endet nach dhcp

4. Die Klammern (...) speichern einen Teil des Suchmusters (vom Anfang bis incl. Leerzeichen nach inet) zwischen. Sie haben hier also eine Sonderbedeutung und sind selbst nicht Teil des Suchmusters.

5. Es folgt die Zusammenfassung der beiden Manipulationen Ersetzen und Einfügen, die man mit geschweiften Klammern bündelt: {...}
6. s// Wenn etwas gefunden ist, wird der gesamte Begriff ausgewählt (indem man hier keinen neuen Begriff innerhalb des s-Kommandos auswählt)...
7. /\1static/ ... und durch das erste (und einzige markierte) Muster aus 4 mit einem folgenden static ersetzt. Würde unter 4. noch eine Klammerung folgen, könnte man sie mit \2 ansprechen.
8. a Danach werden die 3 Zeilen eingefügt.

EDIT: Punkt 6 genauer formuliert
Der Hauptunterschied zwischen etwas, was möglicherweise kaputtgehen könnte und etwas, was unmöglich kaputtgehen kann, besteht darin, dass sich bei allem, was unmöglich kaputtgehen kann, falls es doch kaputtgeht, normalerweise herausstellt, dass es unmöglich zerlegt oder repariert werden kann.
Douglas Adams

Antworten