codehunter
Goto Top

Konfigurationsdatei ändern mit sed

Hallo!

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 face-sad

Grüße und schönen Sonntag euch!
Cody

Content-Key: 3714729378

Url: https://administrator.de/contentid/3714729378

Printed on: July 21, 2024 at 01:07 o'clock

Mitglied: 3714160434
Solution 3714160434 Aug 21, 2022 updated at 19:25:32 (UTC)
Goto Top
sed -re '/^\[SectionB\]/,/^\[/{/\[\[SubsectionA\]\]/,/\[\[/{s/(settingA = ).*/\1valueX/}}' file.conf >file_new.conf  
Member: Codehunter
Codehunter Aug 22, 2022 at 06:47:12 (UTC)
Goto Top
Hallo airbus! Solche Expressions hatte ich auch schon, aber was macht der Parameter -re? Lag es womöglich daran?
Mitglied: 3714160434
3714160434 Aug 22, 2022 updated at 12:20:36 (UTC)
Goto Top
Zitat von @Codehunter:

aber was macht der Parameter -re?
RTFM
https://linux.die.net/man/1/sed
Lag es womöglich daran?
Rub your glass ball.

screenshot
Member: Codehunter
Codehunter Aug 22, 2022 at 12:55:00 (UTC)
Goto Top
Zitat von @3714160434:

Zitat von @Codehunter:

aber was macht der Parameter -re?
RTFM
https://linux.die.net/man/1/sed
Lag es womöglich daran?
Rub your glass ball.


Öhm... ein --help ist mir durchaus geläufig face-wink Nur sagt ein "use extended regular expressions in the script" noch rein gar nichts darüber aus, was denn da nun "extended" wird. Das macht ein Script testen nicht gerade einfacher. Aber gut, wir sind ja zum Ziel gekommen face-smile
Mitglied: 3714160434
3714160434 Aug 22, 2022 updated at 13:30:02 (UTC)
Goto Top
-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
/^\[SectionB\]/,/^\[/'   
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.
/\[\[SubsectionA\]\]/,/\[\[/
Dies sucht innerhalb des obigen Abschnitts nach "[[SubsectionA]]" bis zum nächsten Subabschnitt der mit "[[" beginnt. Innerhalb dieses Abschnitts wird nun ersetzt mit
s/(settingA = ).*/\1valueX/
was nach "settingA = " sucht und den Wert dahinter ersetzt. \1 ist dabei die Subexpression die im ersten Ausdruck geklammert ist, also das "settingA = ".
Member: Codehunter
Codehunter Aug 30, 2022 at 17:58:44 (UTC)
Goto Top
Sorry für die späte Rückmeldung, bin zur Zeit an sehr vielen Baustellen dran. Und Danke für die ausführlichen Erläuterungen. Es ist halt wieder ein Beispiel dafür, dass manche Shellprogramme schwer zugänglich sind. sed kannste wirklich für alle Schandtaten gebrauchen aber die Hilfe ist eine Katastrophe face-big-smile