it-swarm.com.de

Vim - wie man eine neue Zeile \ n durch zwei \ n ersetzt

Im vim-Editor möchte ich ein Zeilenumbruchzeichen (\ n) im vim-Befehlsmodus durch zwei neue Zeilenzeichen (\ n\n) ersetzen.

Inhalt der Eingabedatei:

This is my first line.
This is second line.

Befehl, den ich ausprobiert habe:

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

es ersetzt die Zeichenfolge durch unerwünschte Zeichen als

This is my first line.^@^@This is second line.^@^@

Dann habe ich den folgenden Befehl ausprobiert

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

Es funktioniert richtig. Können Sie erklären, warum es mit dem zweiten Befehl gut funktioniert?

40
Raghvendra

Seltsamerweise \n in vim für Ersetzung bedeutet nicht Zeilenumbruch, sondern null. ASCII nul ist ^@ (control@).

Historisch gesehen ersetzt vi ^M (controlM) als Zeilenende, das ist die neue Zeile. vim hat eine Erweiterung hinzugefügt \r (wie die C-Sprache) bedeutet dasselbe wie ^M, aber die Entwickler entschieden sich für \n bedeutet null, wenn Text ersetzt. Dies steht im Widerspruch zu seiner Verwendung bei Suchen , bei denen eine neue Zeile gefunden wird.

Weiterführende Literatur:

52
Thomas Dickey

Versuche dies: %s/$/^V^M/ (wo ^V ist Ctrl-V und ^M ist Ctrl-M - wenn Sie ^V es wird ein ^ char dann Rücktaste darüber und dann, wenn Sie das ^M erscheint als ^M ... die Strg-V ist das Standard-tty Literal next Zeichen - führen Sie den Befehl stty -a um die Sonderzeichen deines tty zu zeigen).

7
Murray Jensen

vim benutze \n um ein Nullzeichen darzustellen \0 im Speicher, wie vim Handle-Datei Nullzeichen enthält (während vi nicht kann).

Die Verwendung von \n stimmt nur mit dem Zeilenende im Puffer überein, nicht mit der neuen Zeile in der Zeichenfolge, wenn der Ausdruck verwendet wird.

Weitere Informationen finden Sie unter : h NL-verwendet-für-Null und : h CR-verwendet-für-NL .

6
cuonglm

Getestet mit den Versionen Neovim (nvim) und Vim

NVIM v0.3.0
VIM - Vi IMproved 8.1

Entfernen Sie eine neue Zeile:

cell
allele
rs2981578
fgfr2

Hier stimmt \n Mit Zeilenumbrüchen überein (um einfügen eine neue Zeile, verwenden Sie jedoch \r):

:'<,'>s/\n/|/g

cell|allele|rs2981578|fgfr2

Fügen Sie eine neue Zeile hinzu:

Nee:

cell|allele|rs2981578|fgfr2

:'<,'>s/\n/|/g

cell^@allele^@rs2981578^@fgfr2

^@ Ist eine diakritische Markierung für LF (Zeilenvorschub; siehe http://vimhelp.appspot.com/digraph.txt.html#digraphs-default) )

Ja:

cell|allele|rs2981578|fgfr2

:'<,'>s/|/\r/g

cell
allele
rs2981578
fgfr2

Um die Frage des OP zu beantworten (wie man einen \n Durch zwei \n\n Ersetzt), fügen Sie einfach einen weiteren \r Hinzu:

cell
allele
rs2981578
fgfr2

:'<,'>s/\n/\r\r/g

cell

allele

rs2981578

fgfr2

... d. h. mit der ursprünglichen Zeilenumbruch (\n) übereinstimmen und diese durch zwei Zeilenumbrüche/Wagenrückläufe (\r\r) ersetzen.

2
Victoria Stuart