Gibt es eine Möglichkeit, sed
das Muster bei jedem zweiten Auftreten zu ersetzen? Oder zumindest in jeder zweiten Zeile? (Sicher ist es mit einem Skript möglich, aber ich habe mich gefragt, ob sed
ich es schaffen kann).
Bearbeiten
ich fand
sed -e "s/pattern/replacement/g;n"
Aber es ersetzte jedes erste Vorkommen, nicht das zweite.
Beispiel
Eingabedatei:
I have a pattern in each line
Also the second line has the pattern
Another pattern here
And -- you guess it -- a pattern
Gewünschte Ausgabe:
I have a pattern in each line
Also the second line has the replacement
Another pattern here
And -- you guess it -- a replacement
sed -e 'n;s/2004-2009/6e législature/g'
, das mein Problem gelöst hat.Ersetzt das zweite Vorkommen in jeder Zeile mit dem Muster.
wenn Sie GNU haben
sed
:Ausgehend von Zeile 1
1
wird die Zeile, nachdem sie dem Musterbereich hinzugefügt wurde, durchN
dass
Kommando das zweite Vorkommen des Musters ersetzt. Dannsed
werden zwei Zeilen nach unten verschoben~2
und wiederholt.quelle
code
(sed '1 ~ 2s / Muster / Ersatz /')Die einfache Interpretation:
In der ersten Zeile, die mindestens ein Vorkommen von PATTERN enthält, möchten Sie es ignorieren und die Zeile unverändert drucken. In der zweiten Zeile, die mindestens ein Vorkommen von PATTERN enthält, möchten Sie die erste Instanz von PATTERN durch REPLACEMENT ersetzen. In der dritten Zeile, die mindestens ein Vorkommen von MUSTER enthält, möchten Sie die Zeile unverändert drucken. In der vierten Zeile, die mindestens ein Vorkommen von PATTERN enthält, möchten Sie die erste Instanz von PATTERN durch REPLACEMENT ersetzen. Und so weiter. Zeilen, die nicht mit MUSTER übereinstimmen, sollten unverändert gedruckt werden.
Dies kann mit Sed einfach so gemacht werden:
Oder mit weniger Leerzeichen und einem kürzeren Etikett:
EDIT: Ich habe gerade die Frage noch einmal gelesen und die schwierigere Interpretation entdeckt:
Ersetzen Sie das zweite Vorkommen von PATTERN im gesamten Dokument durch REPLACEMENT, unabhängig davon, ob es in derselben Zeile wie das erste Vorkommen auftritt oder nicht. Lassen Sie das erste und dritte Vorkommen unverändert. Etc.
Ich glaube, dass dies auch mit Sed möglich ist, obwohl es VIEL schwieriger ist und ich glaube, dass es vom regulären Ausdruck abhängt, der verwendet werden soll. Ich werde versuchen, etwas auszuarbeiten und zu posten, aber ich werde diese Antwort vorerst mit der obigen einfachen Version stehen lassen.
quelle
t
est durch eineq
uit und nehmen Sie Eingaben wie{ sed '...'; cat; } <input
für nur einen einzigen ErsatzSie waren sehr nah dran, überspringen Sie einfach die erste Zeile:
Warum sollte
awk
in diesem Fall das bessere Werkzeug sein?quelle
Ein Symbolmuster innerhalb einer Zeile: sed 's / (a [^ a] *) a / \ 1c / g'
Jedes zweite Muster (möglicherweise wird nur eine Musterübereinstimmung pro Zeile angezeigt. Wenn zwei oder mehr Übereinstimmungen pro Zeile angezeigt werden, wird nur die zweite ersetzt.)
quelle