Ich habe eine Datei mit folgendem Muster:
foo 111
baz
foo 222
baz
foo 333
baz
was in verwandelt werden muss
foo 111
bar 111
baz
foo 222
bar 222
baz
foo 333
bar 333
baz
Duplizieren Sie also alle Zeilen, die mit beginnen foo
, und ändern Sie nur foo
das Duplikat, lassen Sie jedoch den Rest der Zeile (der sich jeweils unterscheidet) intakt. Wie macht man das?
regular-expression
search
LB7979
quelle
quelle
Antworten:
Bitte schön:
Zerlegen:
Da der
g
Befehl das Suchmuster aktualisiert, können Sie das zu ersetzende Muster im Ersatzbefehl weglassen. (ref ::h :g
, suchen nachsearch pattern
).Ältere Version:
Zerlegen:
Zum Einsetzen der
^M
Presse Ctrl+vund enter.Hinweis : Ich habe mir ursprünglich die "ältere" Version ausgedacht, bevor ich von dem
t
Befehl erfahren habe . Ich werde es verlassen, aber ich werde es nicht empfehlen. Der erste ist sauberer und unkomplizierter.quelle
foo
... begann^M
wie ich erklärt habe?t
, und dann habe ich die zweite hinzugefügt. Ich werde die Reihenfolge ändern, du hast recht. Wie wäre es mit dem ersten POSIX?Ich mache die ganze Zeit solche Sachen und mache einfach so etwas
%s/^foo \(.*\)/foo \1\rbar \1/
(teilweise, weil ich auch viele ähnliche Aufgaben mache, die mit einer Kopierfunktion nicht in etwas Kluges verwandelt werden können und\(.*\)
mittlerweile Teil meines Muskelgedächtnisses sind).Ich vermute, dass es nicht POSIX-kompatibel ist (es funktioniert nicht auf anderen vi-Klonen), aber die Verwendung von
^M
( C-VReturn) anstelle von\r
scheint auf den meisten anderen vi-Klonen zu funktionieren.quelle