Vim - wie man eine neue Zeile durch zwei ersetzt

34

Im VIM-Editor möchte ich im VIM-Befehlsmodus ein Zeilenumbruchzeichen (\ n) durch zwei neue Zeilenumbrüche (\ 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

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 einwandfrei. Können Sie erklären, warum es mit dem zweiten Befehl gut funktioniert?

Raghvendra
quelle
Siehe auch unix.stackexchange.com/a/206404
Stéphane Chazelas
2
Zu Ihrer Information: Es gibt auch eine Vi and Vim (beta) SE .
Dubu
2
Randnotiz, müssen Sie nicht /als Trennzeichen verwenden. Dies ist besser lesbar::%s;\n;\n\n;g
DJMcMayhem
1
Suchen Sie nach \n, ersetzen \r\r, :% s/\n/\r\r/g: stackoverflow.com/a/71334/911945
Anton Tarasenko

Antworten:

47

Seltsamerweise bedeutet \nin vim für Ersatz nicht newline, sondern null. ASCII nul ist ^@( control@).

Historisch gesehen ersetzt vi ^M( controlM) als Zeilenende, das ist die neue Zeile. vim fügte eine Erweiterung \r(wie die C-Sprache) hinzu, die das Gleiche wie bedeutet ^M, aber die Entwickler entschieden sich dafür \n, beim Ersetzen von Text den Mittelwert auf null zu setzen . Dies steht im Widerspruch zu seiner Verwendung bei Suchvorgängen , bei denen eine neue Zeile gefunden wird.

Weitere Lektüre:

Thomas Dickey
quelle
7

Versuchen Sie Folgendes: %s/$/^V^M/(Wo ^Vist Ctrl-Vund ^Mist Ctrl-M- wenn Sie ^Ves eingeben, wird ein Zeichen gedruckt, dann ein ^Leerzeichen darüber und wenn Sie das Zeichen eingeben, ^Mwird es angezeigt als ^M... das Strg-V ist das Standardtty- Literal für das nächste Zeichen - führen Sie den Befehl aus, stty -aum zeigen Sie die Sonderzeichen Ihres tty).

Murray Jensen
quelle
In der Tat werden die sehr erfahrenen Anwender dies für die jemals erforderliche Konvertierung von CRLF als Alternative zum Wegfallen und Verwenden von dos2unix oder ähnlichem wissen. Die Verwendung von Strg-V ist eine Lektion für den ersten Tag.
McKenzm
5

vimVerwenden Sie \ndiese Option, um ein Nullzeichen \0im Speicher darzustellen , das wie eine vimHandle-Datei ein Nullzeichen enthält (während vidies nicht möglich ist).

Bei Verwendung von \nin expression wird nur das Zeilenende im Puffer abgeglichen, nicht die neue Zeile in der Zeichenfolge.

Weitere Informationen finden Sie unter : h NL-used-for-Null und : h CR-used-for-NL .

cuonglm
quelle
1

Getestet mit Neovim ( nvim) und VimVersionen

NVIM v0.3.0
VIM - Vi IMproved 8.1

Entfernen Sie eine neue Zeile:

cell
allele
rs2981578
fgfr2

Hier werden \nZeilenumbrüche abgeglichen (zum Einfügen eines Zeilenumbruchs verwenden Sie jedoch \r):

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

cell|allele|rs2981578|fgfr2

Füge eine neue Zeile hinzu:

Nee:

cell|allele|rs2981578|fgfr2

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

cell^@allele^@rs2981578^@fgfr2

^@ist ein diakritisches Zeichen 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

Fügen Sie einfach eine weitere hinzu , um die Frage des OP zu beantworten (wie man eine \ndurch zwei ersetzt \n\n) \r:

cell
allele
rs2981578
fgfr2

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

cell

allele

rs2981578

fgfr2

... dh passen Sie den ursprünglichen Zeilenumbruch an ( \n) und ersetzen Sie ihn durch zwei Zeilenumbrüche / Zeilenumbrüche ( \r\r).

Victoria Stuart
quelle