Konfigurationsdatei ändern mit sed
Hallo!
Ich habe eine Konfigurationsdatei ähnlich dieser:
Diese Mehrdeutigkeit der Schlüsselnamen bei den Key-Value-Paaren kommt so tatsächlich vor. Jetzt möchte ich mit sed SectionB.SubsectionA.settingA von valueE auf valueX ändern. Das Ergebnis muss dann so aussehen (Einrückungen und Kommentare erhalten ist wichtig!):
Ich scheitere aber an den nötigen Regular Expressions. Entweder wird die betreffende Stelle gar nicht ersetzt, sie wird in der SectionA ersetzt oder wird in SectionA und SectionB ersetzt. Aber dass sie NUR in SectionB.SubsectionA ersetzt wird, bekomme ich nicht hin
Grüße und schönen Sonntag euch!
Cody
Ich habe eine Konfigurationsdatei ähnlich dieser:
[SectionA]
# Irgendein Kommentar
[[SubsectionA]]
settingA = valueA
settingB = valueB
# Noch ein Kommentar
[[SubSectionB]]
settingA = valueC
settingB = valueD
[SectionB]
# Ein weiterer Kommentar
[[SubsectionA]]
settingA = valueE
settingB = valueF
# Und noch ein anderer Kommentar
[[SubSectionB]]
settingA = valueG
settingB = valueH
Diese Mehrdeutigkeit der Schlüsselnamen bei den Key-Value-Paaren kommt so tatsächlich vor. Jetzt möchte ich mit sed SectionB.SubsectionA.settingA von valueE auf valueX ändern. Das Ergebnis muss dann so aussehen (Einrückungen und Kommentare erhalten ist wichtig!):
[SectionA]
# Irgendein Kommentar
[[SubsectionA]]
settingA = valueA
settingB = valueB
# Noch ein Kommentar
[[SubSectionB]]
settingA = valueC
settingB = valueD
[SectionB]
# Ein weiterer Kommentar
[[SubsectionA]]
settingA = valueX
settingB = valueF
# Und noch ein anderer Kommentar
[[SubSectionB]]
settingA = valueG
settingB = valueH
Ich scheitere aber an den nötigen Regular Expressions. Entweder wird die betreffende Stelle gar nicht ersetzt, sie wird in der SectionA ersetzt oder wird in SectionA und SectionB ersetzt. Aber dass sie NUR in SectionB.SubsectionA ersetzt wird, bekomme ich nicht hin
Grüße und schönen Sonntag euch!
Cody
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 3714729378
Url: https://administrator.de/contentid/3714729378
Ausgedruckt am: 21.11.2024 um 12:11 Uhr
6 Kommentare
Neuester Kommentar
sed -re '/^\[SectionB\]/,/^\[/{/\[\[SubsectionA\]\]/,/\[\[/{s/(settingA = ).*/\1valueX/}}' file.conf >file_new.conf
-r nutze ich aus Gewohnheit weil ich oft die erweiterten Regex-Befehle benutze und die funktionieren eben nur mit dem Schalter, da hier in der Zeile Subexpressions benutzt werden ist der Schalter nötig, sonst kommt die Fehlermeldung
Ungültiger Verweis \1 im rechten Teil (»RHS«) des »s«-Befehls
Wars das jetzt? Funktioniert hier im Test, s.o.
Hier nochmal das was die einzelnen Schritte machen, damit du auch nicht dumm stirbst
Suche am Zeilenanfang nach "[SectionB]", dann suche nach ein am Zeilenanfang auftretendes "[". Nun wird alles was zwischen diesen beiden Regex vorkommt an das was zwischen den geschweiften Klammern "{}" steht übergeben.
Dies sucht innerhalb des obigen Abschnitts nach "[[SubsectionA]]" bis zum nächsten Subabschnitt der mit "[[" beginnt. Innerhalb dieses Abschnitts wird nun ersetzt mit
was nach "settingA = " sucht und den Wert dahinter ersetzt. \1 ist dabei die Subexpression die im ersten Ausdruck geklammert ist, also das "settingA = ".
Ungültiger Verweis \1 im rechten Teil (»RHS«) des »s«-Befehls
Wars das jetzt? Funktioniert hier im Test, s.o.
Hier nochmal das was die einzelnen Schritte machen, damit du auch nicht dumm stirbst
/^\[SectionB\]/,/^\[/'
/\[\[SubsectionA\]\]/,/\[\[/
s/(settingA = ).*/\1valueX/