Ändern Sie den Text zwischen markierten Zeilen

454
pesekvi

Ich habe eine Datei mit mehr als 8000 Zeilen. Die Datei ist in Abschnitte unterteilt, jeder Abschnitt ist mit einem Text wie ## C, ## T, ## N gekennzeichnet. Ich muss einige Zeilen in der Datei ändern. Ich habe den Befehl SED verwendet, um Linien zwischen diesen Markierungen zu markieren. Ich bin neu bei Bash, daher würde ich mich über etwas Hilfe freuen. Ich muss den Text zwischen diesen Markierungen ändern

##C ##A - beginning marker (must be next row after ##C) text lines, some of them I have to modify text lines, some of them I have to modify ##B -end marker 

Bisher habe ich diesen Befehl, um Linien zwischen Markierungen zu markieren

sed -e '/##A/,/##B/{}' file.txt 

Zeilen sind wie folgt formatiert:

ZDMAD BELCH 0 0 25 26 30 50 

Mein Ziel ist es, einige Spalten in bestimmten Zeilen zu ändern. Zum Beispiel: Wenn die erste Spalte ZDMAD ist, ändern Sie die 3. Spalte in 15.

Früher habe ich diese gelöste Frage für meinen am weitesten Fortschritt

0

1 Antwort auf die Frage

0
Kamil Maciorowski

Da Sie wissen, wie Sie sednur zwischen Markierungen agieren können, besteht Ihr eigentliches Problem darin, dass Sie noch nicht "einige Spalten ändern" können. Dies kann schwierig sein, da sedSpalten 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 awkbesser, 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:

  1. Setzen Sie nützliche Variablen am Anfang (dh nur einmal); Start in einem nicht markierten Zustand.

Dann für jeden Datensatz:

  1. Wenn das erste Feld die Endmarkierung ist, wechseln Sie in den Status "nicht markiert".
  2. Wenn die Bedingung in einem "markierten" Zustand erfüllt ist, führen Sie die Arbeit aus.
  3. Wenn das erste Feld die Anfangsmarkierung ist, wechseln Sie in den Status "Markiert".
  4. 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.

Vielen Dank. Ich musste einen Regex-Vergleich hinzufügen, um sicherzustellen, dass die Zeilen mit ## N und ## A vor dem Text stehen, den ich modifiziere. Aber nach einiger Zeit funktioniert es. Ich bin super neu in awk oder sed. Ich habe nur einfache Sicherungsskripte erstellt, die Teil von Crontab waren. Nochmals vielen Dank für Ihre Antwort. :) pesekvi vor 6 Jahren 0