So ersetzen Sie das dritte Vorkommen der Zeichenfolge in der Datei mit dem sed
Befehl.
Beispiel:
Ändern Sie nur das dritte Vorkommen von is
to us
in der Datei.
Meine Eingabedatei enthält:
hai this is linux.
hai this is unix.
hai this is mac.
hai this is unchanged.
Ich erwarte Ausgabe ist:
hai this is linux.
hai thus is unix.
hai this is mac.
hai this is unchanged.
text-processing
sed
perl
Suresh Kumar
quelle
quelle
sed
ist nicht das richtige Werkzeug für den Job.Antworten:
Es ist viel einfacher gemacht
perl
.Um die 3 zu ändern rd Vorkommen:
So ändern Sie jedes dritte Vorkommen:
quelle
Wenn die Ersetzungszeichenfolge nur einmal pro Zeile vorkommt, können Sie verschiedene Dienstprogramme kombinieren.
Wenn sich die Eingabe in der Datei "Eingabe" befindet und Sie "ist" durch "uns" ersetzen, können Sie verwenden
quelle
is
pro Zeile.Das folgende Skript (unter Verwendung der GNU-
sed
Syntax) kann für die Inplace-Bearbeitung und nicht für die Ausgabe verwendet werden, da die Druckzeilen nach der gewünschten Ersetzung gestoppt werden:Wenn Sie eine Choroba- Entscheidung mögen , können Sie diese oben ändern
welches alle Zeilen ausgibt
Oder Sie müssen alle Zeilen in den Musterbereich einfügen (im Speicher, seien Sie also vorsichtig mit der Größenbeschränkung) und ersetzen
quelle
Sie können dies verwenden
sed
, wenn zuvor Zeilenumbrüche durch andere Zeichen ersetzt wurden, z.Und das gleiche mit pure (GNU)
sed
:(
sed
Newline-Ersatz, der schamlos von /programming//a/1252191/4488514 gestohlen wurde )quelle
sed
spezifische Syntax verwenden möchten, können Sie diese auch verwendensed -z 's/is/us/3'
.-z
muss eine brandneue Funktion sein, ichGNU sed version 4.2.1
weiß nichts über diese Option.\x0
Schritt.Dieses Bit von
sed
trägt nur eine Liste vonis
Ereignissen von einer Zeile zur nächsten. Es sollte zuverlässig so vieleis
es pro Zeile verarbeiten, wie Sie darauf werfen, und es muss dabei keine alten Zeilen puffern - es behält nur ein einzelnes Zeilenumbruchzeichen für jedesis
, auf das es trifft, das nicht Teil eines anderen Wortes ist.Das Ergebnis ist, dass nur das dritte Vorkommen in einer Datei geändert wird - und die Anzahl pro Zeile übertragen wird. Wenn also eine Datei so aussieht:
... es wird gedruckt ...
Zunächst werden Randfälle behandelt, indem am Kopf und am Ende jeder Zeile ein Leerzeichen eingefügt wird. Dies erleichtert die Ermittlung von Wortgrenzen.
Als nächstes wird nach gültigen
is
es\n
gesucht, indem eine Ewline eingefügt wird, bevor alle Vorkommenis
unmittelbar vor null oder einem Satzzeichen stehen, gefolgt von einem Leerzeichen. Es führt einen weiteren Durchgang durch und entfernt alle\n
Ewlines, denen unmittelbar ein Nicht-Leerzeichen vorangestellt ist. Diese zurückgelassenen Markierungen stimmen übereinis.
undis
aber nichtthis
oder?is
.Als nächstes wird jeder Marker am Ende der Zeichenfolge
\ni
gesammelt. Bei jeder Übereinstimmung in einer Zeile wird eine\n
neue Zeile an das Ende der Zeichenfolge angehängt und durch entwederi
oder ersetztu
. Wenn\n
sich am Ende des Strings 3 Ewlines in einer Reihe befinden, wird das u - sonst das i verwendet. Das erste Mal, wenn au verwendet wird, ist auch das letzte Mal - der Ersatz löst eine Endlosschleife aus, die aufget line, print line, get line, print line,
usw. hinausläuft.Am Ende jedes Try-Loop-Zyklus werden die eingefügten Leerzeichen bereinigt, nur bis zur ersten auftretenden neuen Zeile im Musterbereich gedruckt und erneut ausgeführt.
Ich werde einen
l
ook-Befehl am Kopf der Schleife hinzufügen wie:... und schauen Sie sich an, was es mit dieser Eingabe macht:
... also hier ist was es tut:
Es macht vielleicht mehr Sinn mit mehr
is
es pro Zeile:Das ist praktisch das Gleiche, aber mit POSIX BRE und rudimentärer Argumentation geschrieben.
... bekommt ...
... und wenn ich aktiviere
${dbg}
:... wir können es iterieren sehen ...
quelle
Hier ist eine logische Lösung, die ein Skript verwendet
sed
undtr
in dieses geschrieben werden muss, damit es funktioniert. Der folgende Code ersetzt jedes dritte Vorkommen des imsed
Befehl angegebenen Wortes . Ersetzen Siei=3
durchi=n
, damit dies für alle funktioniertn
.Code:
Warum das funktioniert:
Angenommen, die Textdatei ist
a b b b b a c a d a b b b a b e b z b s b a b
.Wenn n = 2: Wir wollen jedes zweite Vorkommen von ersetzen
b
.a b b b b a c a d a b b b a b e b z b s b a b
. . ^ . ^ . . . . . . ^ . . ^ . . . ^ . ^ . ^
Wenn n = 3: Wir wollen jedes dritte Vorkommen von ersetzen
b
.a b b b b a c a d a b b b a b e b z b s b a b
. . . ^ . . . . . . . ^ . . . . ^ . . . . . ^
Wenn n = 4: Wir wollen jedes dritte Vorkommen von ersetzen
b
.quelle