Wie kann ich in Vim am Ende jeder Zeile eine Zeichenfolge einfügen?


256

Ich möchte *am Ende jeder Zeile in Vim hinzufügen .

Ich habe den Code erfolglos ausprobiert

:%s/\n/*\n/g

Ihre funktioniert nicht, weil auf der rechten Seite von :s///, \neinem Nullzeichen entspricht. Der Abschnitt :help sub-replace-specialist relevant.
DoubleDown

Antworten:


354

:%s/$/\*/g

sollte arbeiten. So sollte es auch sein, :%s/$/*/gwie MrWiggles richtig hervorhebt .


Gibt es eine Möglichkeit, ' ' in dieselbe Spalte einzufügen , da nicht alle Zeilen dieselbe Länge haben, sodass Zeile 1 möglicherweise ' ' in der 15. Spalte hat, Zeile 2 jedoch '*' in der 25. Spalte.
Aman Jain

11
Es gibt nur 1 EOL pro Zeile, daher ist das gFlag nicht erforderlich.
DoubleDown

Ich wollte / zum Anfang jeder Zeile hinzufügen: 1, $ s / ^ / \ / g hat für mich funktioniert.
Farooqsadiq

@dirkgently Wie kann ich eine String-Variable als Argument an diesen Befehl übergeben (Sie wissen, anstelle des *)?
Matheus Rotta

353

Noch kürzer als der Befehl: search:

:%norm A*

Das bedeutet es:

 %       = for every line
 norm    = type the following commands
 A*      = append '*' to the end of current line

28
Mann, es gibt keinen vi oder vim Thread, von dem ich nichts lerne. Heute lerne ich etwas über Norm. Und wie sie bei Cheers sagen: "Norm!"
Smcameron

4
Zum Voranstellen verwenden Sie einfach 0i *, 0 bringt Sie zum Zeilenanfang, i zum Einfügen und * zum *. D:
Rob

7
Als VimGolfer kann ich nicht anders, als das hinzuzufügen, I*anstatt 0i*Ihnen einen Tastendruck zu ersparen.
Jedidiah verletzt

24
Ein weiterer Tipp: Dies funktioniert auch für Bereiche. Markieren Sie einfach die Linien im visuellen Modus und drücken Sie :, dies wird den Befehl vorab ausfüllen, mit :'<,'>dem Sie dann:'<,'>norm A*
Jedidiah Hurt

8
Verwenden Sie Istattdessen -:%norm I*
Just Lucky Really

42

Ebenfalls:

:g/$/norm A*

Ebenfalls:

gg<Ctrl-v>G$A*<Esc>

Ahhh ... Die zweite kann auch mit einer Auswahl von Zeilen verwendet werden. Nett!
Tim Fletcher

Könnten Sie bitte das erste Beispiel erklären?
Cody Poll

@CodyPoll gist ein globalBefehl, der mit jeder übereinstimmenden Zeile etwas macht. $passt zu jeder Zeile. Es könnte auch ^oder sein .*. norm führt Befehle aus, die Sie normalerweise im Befehlsmodus verwenden. So A*Mittel anhängen *an das Ende der Zeile.
Defhlt

41

Ich denke, die Verwendung des visuellen Blockmodus ist eine bessere und vielseitigere Methode, um mit solchen Dingen umzugehen. Hier ist ein Beispiel:

This is the First line.  
This is the second.  
The third.

So fügen Sie "Hallo Welt" ein. (Leerzeichen + Zwischenablage) am Ende jeder dieser Zeilen:

  • Drücken Sie für ein Zeichen in der ersten Zeile Strg-V (oder Strg-Q, wenn Strg-V Einfügen ist).
  • Drücken Sie jj, um den visuellen Block über drei Zeilen zu erweitern.
  • Drücken Sie $, um den visuellen Block bis zum Ende jeder Zeile zu verlängern. Drücken Sie A, dann Leerzeichen und geben Sie Hello world ein. + dann Esc.

Das Ergebnis ist:

This is the First line. Hello world.  
This is the second. Hello world.  
The third. Hello world.  

(Beispiel von Vim.Wikia.com )


3
Anstatt zu drücken jj, kann man drücken G, um zur letzten Zeile zu gelangen. Dies ist nützlich in großen Dateien, in denen das Drücken jbis zum Erreichen der letzten Zeile nicht praktikabel ist.
Nash

Stimmen Sie zu, dass der visuelle Block hier am saubersten und auch erweiterbarer ist
Peter Dolan

Beachten Sie, dass dies zunächst nicht in allen Zeilen funktioniert, aber nachdem Sie die Esc-Taste gedrückt haben, wird es durchlaufen und allen hinzugefügt.
Noumenon

Visual Block verursacht Probleme und Fehler, wenn vim als Erweiterung für andere Dinge wie VS Code verwendet wird. In diesen Fällen ist das Suchen und Ersetzen, nach dem der ursprüngliche Benutzer fragt, die zuverlässige Option.
Brettins

Stellen Sie sicher, dass Sie Großbuchstaben A verwenden. Kleinbuchstaben "a" funktionieren nicht.
Jeff Hoye

14

Wenn Sie Hello world am Ende jeder Zeile hinzufügen möchten:

:%s/$/HelloWorld/

Wenn Sie dies für eine bestimmte Anzahl von Zeilen tun möchten, verwenden Sie beispielsweise 20 bis 30:

:20,30s/$/HelloWorld/

Wenn Sie dies am Anfang jeder Zeile tun möchten, verwenden Sie:

:20,30s/^/HelloWorld/

6

Das brauchst du gam Ende nicht wirklich . So wird es:

:%s/$/*

Oder wenn Sie nur das *am Ende von möchten , sagen Sie die Zeilen 14-18:

:14,18s/$/*

oder

:14,18norm A*


5

Eine Option ist:

:g/$/s//*

Dadurch wird jeder Linienendanker gefunden und durch ersetzt *. Ich sage "Ersatz", aber in Wirklichkeit ist es eher ein Anhang, da der Anker eher eine besondere Sache als ein normaler Charakter ist. Weitere Informationen finden Sie unter Potenz von g - Beispiele .


Was bedeutet s // im regulären Ausdruck? Ich kenne einen ähnlichen Befehl: g / / / p, (grep). Ich bin mir ziemlich sicher, dass Ihr Befehl zumindest in der Struktur meinem nahe kommt.
Léo Léopold Hertz 28

1
Das s ist ein Ersatz - es ersetzt den Anker am Ende der Linie durch das Sternchen (nun, ersetzt es nicht wirklich, da es ein Ankerpunkt ist).
Paxdiablo

3
:% s / \ n / * \ r / g

Ihre erste ist irgendwo anders richtig, aber Vim muss aus irgendeinem Grund eine andere Newline-Behandlung haben.


In meiner Version von Vim funktioniert \ n, aber dies ersetzt nur die neue Zeile durch ein * und verbindet die Zeilen effektiv.
Nathan Fellman

1
Dieser Befehl funktioniert nachweislich auf jeder Version von Vim, die ich ausprobiert habe. Verwenden Sie die Windows-Version oder so?

1
%s/\s*$/\*/g

Dies reicht aus und stellt sicher, dass führende Leerzeichen ignoriert werden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.