Ich versuche, jede ,
in der aktuellen Datei durch eine neue Zeile zu ersetzen :
:%s/,/\n/g
Aber es fügt ein, was wie eine ^@
statt einer tatsächlichen Newline aussieht. Die Datei befindet sich nicht im DOS-Modus oder so.
Was sollte ich tun?
Wenn Sie neugierig sind, wie ich, überprüfen Sie die Frage Warum ist \ ra Newline für Vim? auch.
Antworten:
Verwenden Sie
\r
anstelle von\n
.Durch Ersetzen durch wird
\n
ein Nullzeichen in den Text eingefügt. Verwenden Sie, um eine neue Zeile zu erhalten\r
. Bei der Suche nach einer neuen Zeile würden Sie diese jedoch weiterhin verwenden\n
. Diese Asymmetrie beruht auf der Tatsache, dass\n
und\r
etwas andere Dinge tun :\n
entspricht einem Zeilenende (Zeilenumbruch), während\r
ein Wagenrücklauf übereinstimmt. Auf der anderen Seite wird bei Ersetzungen\n
ein Nullzeichen\r
eingefügt, während eine neue Zeile eingefügt wird (genauer gesagt, sie wird als Eingabe behandelt <CR>). Hier ist ein kleines, nicht interaktives Beispiel, um dies mithilfe der Vim-Befehlszeilenfunktion zu veranschaulichen (mit anderen Worten, Sie können Folgendes kopieren und in ein Terminal einfügen, um es auszuführen).xxd
zeigt einen Hexdump der resultierenden Datei.Mit anderen Worten,
\n
hat das Byte 0x00 in den Text eingefügt;\r
hat das Byte 0x0a eingefügt.quelle
\r
nicht so. Aber Sie könnenCtrl-V
Enter
anstelle der Eingabe drücken\r
, und es funktioniert.\r
einfüge<CR>
und\n
einfüge, wie würde ich etwas durch einen Wagenrücklauf ersetzen?Hier ist der Trick:
Stellen Sie zunächst Ihre Vi (m) -Sitzung so ein, dass der Musterabgleich mit Sonderzeichen (z. B. Zeilenumbruch) möglich ist. Es lohnt sich wahrscheinlich, diese Zeile in Ihre .vimrc- oder .exrc-Datei einzufügen:
Als nächstes machen Sie:
Um den
^M
Charakter zu erhalten, tippe Ctrl+ Vund drücke Enter. Machen Sie unter Windows Ctrl+Q , Enter. Ich kann mich nur daran erinnern, wie wenig Sinn sie machen:quelle
:set magic
(es ist auch nicht in meinem ~ / _vimrc) nochctrl-q
. Nur eine einfachectrl-v
gefolgt von Eingabe schafft den^M
Charakter für mich ganz gut.Ctrl-C
beendet den Editor nicht wirklich, obwohl Sie dadurch wieder in den normalen Modus zurückkehren können.Ctrl-V
bedeutet wörtlich undCtrl-Q
bedeutet, dass jemand den Fehler gemacht hat, die$VIMRUNTIME/mswin.vim
Konfigurationsdatei zu laden . Sie brauchen keine mswin. Verwenden Sie stattdessen einfach Ihr eigenes vimrc.sed -n l
bis jetzt gemacht. Gut zu wissen, dass das gleiche mitCtrl-v
in vim erreicht werden kann.In der Syntax
s/foo/bar
,\r
und\n
unterschiedliche Bedeutungen haben, je nach Kontext.Kurz:
Für
foo
:\ n = Newline (LF unter Linux / Mac, CR + LF unter Windows)
\ r = Wagenrücklauf (CR)
Für
bar
:\ r = ist Zeilenumbruch
\ n = Null-Byte.
Länger (mit ASCII-Nummern):
NUL
= 0x00 = 0 = Ctrl+ @LF
= 0x0A = 10 = Ctrl+ JCR
= 0x0D = 13 = Ctrl+MHier ist eine Liste der ASCII-Steuerzeichen . Fügen Sie sie über Ctrl+ V, Ctrl+ in Vim ein ---key---.
Geben Sie in Bash oder den anderen Unix / Linux-Shells einfach Ctrl+ ein---key--- .
Versuchen Sie Ctrl+ Min Bash. Es ist dasselbe wie Schlagen Enter, da die Shell erkennt, was gemeint ist, obwohl Linux-Systeme Zeilenvorschübe zur Zeilenbegrenzung verwenden.
Um Literale in Bash einzufügen, funktioniert es auch , wenn Sie ihnen Ctrl+ voranstellen V.
Versuchen Sie es in Bash:
Dies verwendet ANSI-Escape-Sequenzen . Fügen Sie die beiden
^[
über Ctrl+ V, Esc.Sie können auch versuchen, Ctrl+ V, Ctrl+M , Enter, die Sie dies:
Erinnere dich an die
\r
du von oben? :>Diese Liste der ASCII-Steuerzeichen unterscheidet sich von einer vollständigen ASCII-Symboltabelle darin , dass die Steuerzeichen, die über die in eine Konsole / Pseudoterminal / Vim eingefügt werdenCtrl Schlüssel (haha) werden.
Während in C und den meisten anderen Sprachen normalerweise die Oktalcodes verwendet werden, um diese 'Zeichen' darzustellen.
Wenn Sie wirklich wissen wollen, woher das alles kommt: Der TTY entmystifiziert . Dies ist der beste Link, den Sie zu diesem Thema finden, aber Vorsicht: Es gibt Drachen.
TL; DR
Normalerweise
foo
=\n
undbar
=\r
.quelle
:s/x/^M/g
sollte reichen. Fügen Sie die^M
Viactrl-v
gefolgt von einctrl-m
.Sie müssen verwenden:
Um den
^M
Charakter zu erhalten, drücken Sie Ctrl+ vgefolgt von Enter.quelle
\r
kann die Arbeit hier für Sie erledigen.quelle
Verwenden Sie unter Vim unter Windows Ctrl+ Qanstelle von Ctrl+ V.
quelle
Dies ist die beste Antwort für die Art und Weise, wie ich denke, aber in einer Tabelle wäre es schöner gewesen:
Warum ist \ ra Newline für Vim?
Also, umformulieren:
Sie müssen verwenden
\r
, um einen Zeilenvorschub (ASCII0x0A
, die Unix-Newline) in einem Regex-Ersatz zu verwenden, aber das ist dem Ersatz eigen - Sie sollten normalerweise weiterhin damit rechnen, ihn\n
für den Zeilenvorschub und\r
für den Wagenrücklauf zu verwenden.Dies liegt daran, dass Vim
\n
in einem Ersatz das NIL-Zeichen (ASCII0x00
) bezeichnet. Sie haben vielleicht erwartet, dass NIL\0
stattdessen\n
für die übliche Verwendung für Zeilenvorschub\0
freigegeben wurde , hat aber bereits eine Bedeutung für Regex-Ersetzungen, sodass es auf verschoben wurde\n
. Gehen Sie daher weiter, um auch die neue Zeile von\n
nach zu verschieben\r
(was in einem Regex-Muster das Wagenrücklaufzeichen ASCII ist0x0D
).NB:
^M
( Ctrl+ V Ctrl+ Munter Linux) fügt eine neue Zeile ein, wenn sie in einem regulären Ausdruck anstelle eines Wagenrücklaufs verwendet wird, wie andere empfohlen haben (ich habe es gerade versucht).Beachten Sie auch, dass Vim das Zeilenvorschubzeichen beim Speichern in eine Datei basierend auf den Dateiformateinstellungen übersetzt. Dies kann zu Verwirrung führen.
quelle
In Eclipse können die
^M
Zeichen in eine Zeile eingebettet werden, und Sie möchten sie in Zeilenumbrüche konvertieren.quelle
Aber wenn man ersetzen muss, dann funktioniert folgendes:
Oben wird jede nächste Zeile durch die nächste Zeile und dann immer
|-
wieder durch eine neue Zeile ersetzt. Dies wird in Wiki-Tabellen verwendet.Wenn der Text wie folgt lautet:
Es wird geändert in
quelle
Wenn Sie es für eine ganze Datei tun müssen, wurde mir auch vorgeschlagen, dass Sie es über die Befehlszeile versuchen könnten:
quelle
printf 'foo\\nbar\n' | sed 's/\\n/\n/g'
zu sehen, ob es auf Ihrem System funktioniert. (Dank an die guten Leute von #bash on freenode für diesen Vorschlag.)Hier ist die Antwort, die für mich funktioniert hat. Von diesem Typ:
---- Zitieren Verwenden Sie den vi-Editor, um ein Zeilenumbruchzeichen in replace einzufügen
Etwas anderes muss ich tun und kann mich nicht erinnern und muss dann nachschlagen.
Gehen Sie in vi wie folgt vor, um ein Zeilenumbruchzeichen in eine Suche einzufügen und zu ersetzen:
Der obige Befehl würde alle Instanzen von "look_for" durch "replace_with \ n" ersetzen (wobei \ n "newline" bedeutet).
Um das "^ M" zu erhalten, geben Sie die Tastenkombination Ctrl+ ein Vund drücken Sie danach (lassen Sie alle Tasten los) die EnterTaste.
quelle