2432 Stimmen

Wie man ein Zeichen durch einen Zeilenumbruch in Vim ersetzt

Ich versuche, jedes einzelne Element zu ersetzen. , in der aktuellen Datei durch eine neue Zeile zu ersetzen:

:%s/,/\n/g 

Aber es fügt etwas ein, das aussieht wie ein ^@ anstelle eines tatsächlichen Zeilenumbruchs. Die Datei befindet sich nicht im DOS-Modus oder so.

Was sollte ich tun?

Wenn Sie, wie ich, neugierig sind, lesen Sie die Frage Warum ist \r ein Zeilenumbruch für Vim? también.

2 Stimmen

Stack Overflow ist eine Website für Programmier- und Entwicklungsfragen. Diese Frage scheint nicht zum Thema zu gehören, da sie sich nicht auf Programmierung oder Entwicklung bezieht. Siehe Zu welchen Themen kann ich hier Fragen stellen? im Hilfe-Center. Vielleicht Super-Benutzer o Unix & Linux Stack Exchange wäre ein besserer Ort, um zu fragen.

9 Stimmen

@jww diese Frage ist 10 Jahre alt... scheint zu alt zu sein, um zu migrieren. Es gibt viele Fragen wie diese, zum Beispiel: stackoverflow.com/questions/10175812/

51 Stimmen

@jww vim ist ein Werkzeug, das üblicherweise von Programmierern verwendet wird, und Fragen zu Werkzeugen, die üblicherweise von Programmierern verwendet werden, sind ein Thema in Stapelüberlauf . Obwohl dies natürlich besser geeignet ist für Vi und Vim .

3136voto

Konrad Rudolph Punkte 503837

Utilice \r anstelle von \n .

Substituiert durch \n fügt ein Nullzeichen in den Text ein. Um einen Zeilenumbruch zu erhalten, verwenden Sie \r . Wenn Suche für einen Zeilenumbruch verwenden, würden Sie immer noch \n Allerdings. Diese Asymmetrie ist auf die Tatsache zurückzuführen, dass \n y \r leicht unterschiedliche Dinge tun :

\n auf ein Zeilenende (Newline), während \r entspricht einem Wagenrücklauf. Andererseits wird bei Ersetzungen \n fügt ein Nullzeichen ein, während \r fügt einen Zeilenumbruch ein (genauer gesagt, er wird wie die Eingabe behandelt CR ). Hier ist ein kleines, nicht-interaktives Beispiel, um dies zu veranschaulichen, unter Verwendung der Vim-Befehlszeilenfunktion (mit anderen Worten, Sie können das Folgende kopieren und in ein Terminal einfügen, um es auszuführen). xxd zeigt einen Hexdump der resultierenden Datei.

echo bar > test
(echo 'Before:'; xxd test) > output.txt
vim test '+s/b/\n/' '+s/a/\r/' +wq
(echo 'After:'; xxd test) >> output.txt
more output.txt

Before:
0000000: 6261 720a                                bar.
After:
0000000: 000a 720a                                ..r.

Mit anderen Worten, \n hat das Byte 0x00 in den Text eingefügt; \r hat das Byte 0x0a eingefügt.

243voto

Logan Punkte 4031

Hier ist der Trick:

Stellen Sie zunächst Ihre Vi(m)-Sitzung so ein, dass der Mustervergleich mit Sonderzeichen (z.B.: newline) möglich ist. Es lohnt sich wahrscheinlich, diese Zeile in Ihre .vimrc- oder .exrc-Datei einzufügen:

:set magic

Als nächstes tun:

:s/,/,^M/g

Um die ^M Zeichen, Typ Ctrl + V und drücken Enter . Unter Windows tun Sie Ctrl + Q , Enter . Ich kann mich nur daran erinnern, wie wenig Sinn sie machen:

A: Welches ist das schlechteste Steuerzeichen, das für einen Zeilenumbruch verwendet werden kann?

B: Entweder q (weil es normalerweise "Beenden" bedeutet) oder v weil es so einfach wäre, zu tippen Ctrl + C und den Redakteur versehentlich töten.

A: Machen Sie es so.

123voto

sjas Punkte 16831

In der Syntax s/foo/bar , \r y \n haben je nach Kontext unterschiedliche Bedeutungen.


Kurz:

Für foo :

\r == "Wagenrücklauf" ( CR / ^M )
\n == entspricht "Zeilenvorschub" ( LF ) auf Linux/Mac, und CRLF unter Windows

Für bar :

\r == produziert LF auf Linux/Mac, CRLF unter Windows
\n == "Null-Byte" ( NUL / ^@ )

Bei der Bearbeitung von Dateien unter Linux (z. B. auf einem Webserver), die ursprünglich in einer Windows-Umgebung erstellt und hochgeladen wurden (z. B. per FTP/SFTP), werden alle ^M die Sie in vim sehen, sind die CR die von Linux nicht übersetzt werden, da es nur LF um einen Zeilenumbruch darzustellen.


Länger (mit ASCII-Zahlen):

NUL == 0x00 == 0 == Ctrl + kbd>@</kbd == ^@ in vim angezeigt
LF == 0x0A == 10 == Ctrl + J
CR == 0x0D == 13 == Ctrl + M == ^M in vim angezeigt

Hier finden Sie eine Liste der ASCII-Steuerzeichen . Fügen Sie sie in Vim über Ctrl + V , Ctrl + ---key--- .

In der Bash oder den anderen Unix/Linux-Shells geben Sie einfach Ctrl + ---key--- .

Versuchen Sie Ctrl + M in Bash. Es ist dasselbe wie das Drücken von Enter da die Shell erkennt, was gemeint ist, auch wenn Linux-Systeme Zeilenvorschübe zur Begrenzung von Zeilen verwenden.

Zum Einfügen von Literalen in der Bash, setzen Sie ihnen Ctrl + V wird auch funktionieren.

Versuchen Sie es in Bash:

echo ^[[33;1mcolored.^[[0mnot colored.

Diese verwendet ANSI-Escape-Sequenzen . Setzen Sie die beiden ^[ über Ctrl + V , Esc .

Sie könnten auch versuchen Ctrl + V , Ctrl + M , Enter , die Ihnen dies liefert:

bash: $'\r': command not found

Erinnern Sie sich an die \r von oben? :>

Diese ASCII-Steuerzeichen Liste ist anders als eine vollständige ASCII-Symboltabelle dass die Steuerzeichen, die in eine Konsole/Pseudoterminal/Vim über die Ctrl Schlüssel (haha), finden Sie dort.

In C und den meisten anderen Sprachen hingegen werden diese "Zeichen" normalerweise durch Oktalcodes dargestellt.

Wenn Sie wirklich wissen wollen, woher das alles kommt: Das TTY entmystifiziert . Dies ist der beste Link, den Sie zu diesem Thema finden werden, aber Vorsicht: Es gibt Drachen.


TL;DR

Normalerweise foo = \n et bar = \r .

65voto

dogbane Punkte 253146

Sie müssen verwenden:

:%s/,/^M/g

Um die ^M Zeichen, drücken Sie Ctrl + v しかるのち Enter .

46voto

Lasar Punkte 4855

\r kann die Arbeit für Sie erledigen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X