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?
vim
regular-expression
vi-mode
Raghvendra
quelle
quelle
/
als Trennzeichen verwenden. Dies ist besser lesbar::%s;\n;\n\n;g
\n
, ersetzen\r\r
,:% s/\n/\r\r/g
: stackoverflow.com/a/71334/911945Antworten:
Seltsamerweise bedeutet
\n
in 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:
quelle
Versuchen Sie Folgendes:
%s/$/^V^M/
(Wo^V
istCtrl-V
und^M
istCtrl-M
- wenn Sie^V
es eingeben, wird ein Zeichen gedruckt, dann ein^
Leerzeichen darüber und wenn Sie das Zeichen eingeben,^M
wird es angezeigt als^M
... das Strg-V ist das Standardtty- Literal für das nächste Zeichen - führen Sie den Befehl aus,stty -a
um zeigen Sie die Sonderzeichen Ihres tty).quelle
vim
Verwenden Sie\n
diese Option, um ein Nullzeichen\0
im Speicher darzustellen , das wie einevim
Handle-Datei ein Nullzeichen enthält (währendvi
dies nicht möglich ist).Bei Verwendung von
\n
in 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 .
quelle
Getestet mit Neovim (
nvim
) undVim
VersionenEntfernen Sie eine neue Zeile:
Hier werden
\n
Zeilenumbrüche abgeglichen (zum Einfügen eines Zeilenumbruchs verwenden Sie jedoch\r
):Füge eine neue Zeile hinzu:
Nee:
^@
ist ein diakritisches Zeichen für LF (Zeilenvorschub; siehe http://vimhelp.appspot.com/digraph.txt.html#digraphs-default )Ja:
Fügen Sie einfach eine weitere hinzu , um die Frage des OP zu beantworten (wie man eine
\n
durch zwei ersetzt\n\n
)\r
:... dh passen Sie den ursprünglichen Zeilenumbruch an (
\n
) und ersetzen Sie ihn durch zwei Zeilenumbrüche / Zeilenumbrüche (\r\r
).quelle