Ich muss eine Datei wie folgt bearbeiten:
auto wlx00
allow-hotplug wlx00
iface wlx000 inet dhcp
iface wlx000 inet6 auto
post-up sysctl -w net.ipv6.conf.wlx000.accept_ra=2
auto wlx000
Das Ziel ist es, die Zeilen zu löschen, die mit 'iface ... inet6' beginnen, und auch die nächsten Zeilen zu löschen, die mit Leerzeichen beginnen (kann keine oder mehr als eine sein):
iface wlx000 inet6 auto
post-up sysctl -w net.ipv6.conf.wlx000.accept_ra=2
und halten Sie den Rest für das folgende Ergebnis intakt:
auto wlx00
allow-hotplug wlx00
iface wlx000 inet dhcp
auto wlx000
Ich habe es mit sed wie folgt versucht:
sed -i.old -r -e "/iface\s*\w*\s*inet6.*/,\${d;/^\s.*/d;}" /etc/configfile
aber es entfernt alles, was an der richtigen Stelle beginnt, aber bis zum Ende gelöscht wird. Ich möchte nur Zeilen entfernen, die nach dem ausgewählten iface-Text mit Leerzeichen versehen sind.
text-processing
awk
sed
fcm
quelle
quelle
Antworten:
Probieren Sie diese Anpassung Ihres
sed
Einzeilers aus:Es entspricht dem Bereich von Ihrem ersten Muster bis zur ersten Zeile, die NICHT mit einem Leerzeichen beginnt, und löscht die Zeilen, die mit einem Leerzeichen oder einem "i" beginnen (für das führende
iface
). Umdenken muss, sollte dasi
nach dem Block erforderlich sein.Sieht so aus:
Bitte versuchen Sie es und melden Sie sich zurück.
quelle
Ein Skript für Standard
sed
, das eine explizite Schleife verwendet, um die Zeilen zu löschen:Das Skript findet die
inet6
Zeilen und hängt dann die nächste Zeile intern im Musterbereich an diese Zeile an (mit einem eingebetteten Zeilenumbruchzeichen dazwischen). Anschließend wird der Musterbereich bis einschließlich des ersten Zeilenumbruchzeichens gelöscht (dies löscht die ursprünglicheinet6
Zeile). Dies wird so lange fortgesetzt, bis der Musterbereich nicht mehr mit einem Leerzeichen (Leerzeichen oder Tabulator) beginnt.Testen:
Testen auf künstlichen Daten:
Das Skript als "Einzeiler":
quelle
Sie haben bereits gute Antworten für das
sed
Tool, aber lassen Sie mich einen anderen, meiner Meinung nach viel einfacheren Ansatz vorschlagen, indem Sie Folgendes verwendenpcregrep
:Die Regex sollte selbsterklärend sein - wir suchen nach Mustern, beginnend mit der Zeile
^iface.*inet6
und dann mit der Gruppe eines beliebigen Zeichens ODER einer neuen Zeile, gefolgt von einem einzelnen Leerzeichen, das null oder mehrmals wiederholt wird. Dann müssen wir nur noch anweisenpcregrep
, die multi-lineare Übereinstimmung mit der-M
Option zuzulassen und das Ganze umzudrehen-v
(übereinstimmende Teile werden entfernt).quelle
pcregrep
, viel intuitiver.