Da Sie wissen, wie Sie sed
nur zwischen Markierungen agieren können, besteht Ihr eigentliches Problem darin, dass Sie noch nicht "einige Spalten ändern" können. Dies kann schwierig sein, da sed
Spalten nicht bekannt sind.
Zum Beispiel: Wenn die erste Spalte ZDMAD ist, ändern Sie die 3. Spalte in 15.
Vielleicht wird dieses spezielle Beispiel gelöst sed
, aber im Allgemeinen ist das Bearbeiten von Spalten awk
besser, weil Datensätze in Felder aufgeteilt werden und auf dieser Abstraktionsebene ausgeführt werden.
Das funktioniert in meinem Debian:
awk ' BEGIN { marked=0 markA="##A" markZ="##B" } $1==markZ $1=="ZDMAD" && marked==1 {$3=15} $1==markA ' file.txt
Der Ablauf:
- Setzen Sie nützliche Variablen am Anfang (dh nur einmal); Start in einem nicht markierten Zustand.
Dann für jeden Datensatz:
- Wenn das erste Feld die Endmarkierung ist, wechseln Sie in den Status "nicht markiert".
- Wenn die Bedingung in einem "markierten" Zustand erfüllt ist, führen Sie die Arbeit aus.
- Wenn das erste Feld die Anfangsmarkierung ist, wechseln Sie in den Status "Markiert".
- Drucken Sie den gesamten Datensatz.
Beachten Sie, dass die Prozedur zuerst nach der Endmarkierung sucht, den Job ausführt und zuletzt nach der Anfangsmarkierung sucht. Der Punkt ist, es sollte Markierungslinien nicht manipulieren. In Ihrem Beispielfall kann die Bedingung ( ZDMAD
) nicht mit einer Markierungslinie übereinstimmen. Eine andere Sequenz wäre also kein Problem. Im Allgemeinen sollten Sie dies jedoch berücksichtigen.