Frage Wie ersetze ich ein Zeichen durch eine neue Zeile in Vim?


Ich versuche, jeden zu ersetzen , in der aktuellen Datei durch eine neue Zeile:

:%s/,/\n/g 

Aber es fügt ein, was wie ein aussieht ^@ anstelle einer tatsächlichen Zeilenschaltung. Die Datei ist nicht im DOS-Modus oder so.

Was soll ich machen?

Wenn Sie neugierig sind, wie ich, überprüfen Sie die Frage Warum ist ein Newline für Vim? auch.


1587
2017-09-16 11:19


Ursprung


Antworten:


Benutzen \r Anstatt von \n.

Ersetzen durch \n fügt ein Nullzeichen in den Text ein. Um eine neue Zeile zu erhalten, verwenden Sie \r. Wann Suche Für eine neue Zeile würden Sie immer noch verwenden \n, jedoch. Diese Asymmetrie ist darauf zurückzuführen, dass \n und \r  etwas andere Dinge tun:

\n passt auf ein Zeilenende (Newline), wohingegen \r entspricht einem Wagenrücklauf. Auf der anderen Seite, in Substitutionen \n fügt ein Nullzeichen ein, während \r fügt einen Zeilenumbruch ein (genauer gesagt, es wird als Eingabe behandelt <CR>). Hier ist ein kleines, nicht interaktives Beispiel, um dies zu veranschaulichen, mit der Vim-Befehlszeilenfunktion (mit anderen Worten, Sie können das Folgende in ein Terminal kopieren und 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.


2074
2017-09-16 11:21



Hier ist der Trick:

Stellen Sie zuerst Ihre vi (m) -Sitzung so ein, dass Muster mit Sonderzeichen abgeglichen werden (zB: Zeilenumbruch). Es lohnt sich wahrscheinlich, diese Zeile in Ihre .vimrc- oder .exrc-Datei zu schreiben.

:set magic

Als nächstes:

:s/,/,^M/g

Um das zu bekommen ^M Zeichen, geben Sie ein Steuerung-v und hit Eingeben. Unter Windows tun Steuerung-q, Eingeben. Der einzige Weg, an den ich mich erinnern kann, ist, sich daran zu erinnern, wie wenig Sinn sie machen:

EIN: Was wäre der schlechteste Kontrollcharakter, um eine Newline darzustellen?

B: Entweder q (weil es normalerweise "Quit" bedeutet) oder v weil es so einfach zu tippen wäre Steuerung-c aus Versehen und töte den Editor.

EIN: Mach es so.


166
2017-09-25 23:40



In der Syntax s/foo/bar  \r und \n haben unterschiedliche Bedeutungen, abhängig vom Kontext.


Zum foo:
\ n = Zeilenumbruch
\ r = CR (Wagenrücklauf = Ctrl-M = ^ M)

Zum bar:
\ r = ist newline
\ n = Nullbyte (0x00).


Ich habe in der Vergangenheit schon öfters Fragen zu solchen Sachen gesehen, und irgendwann in der Zukunft wird fast niemand mehr etwas über dieses Zeug wissen ...

Durch "populäre" Anfrage:

Hier ist eine Liste der ASCII-Steuerzeichen, füge sie ein vim über STRGvSTRG---Schlüssel---.
Im bash oder die anderen Unix / Linux-Shells einfach eingeben STRG---Schlüssel---. Versuchen STRGM in bash, es ist das gleiche wie schlagen EINGEBEN, da die Shell erkennt, was gemeint ist, obwohl Linux-Systeme Line Feeds für die Zeilenbegrenzung verwenden. Nur das Steuerzeichen für Line Feed ist CTRL-A, die in bash 'zum Zeilenanfang springen' muss.

Um Literale in bash einzufügen, STRGv wird auch funktionieren.

Probieren Sie bash aus:

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

Dies verwendet ANSI-Escape-Sequenzen, füge die zwei ein ^[ist über STRGvESC.

Sie könnten es auch versuchen STRGvSTRGmEINGEBEN, die dir das geben wird:

bash: $'\r': command not found

Erinnere dich an die \r von oben? :>

Das ASCII-Steuerzeichen Liste unterscheidet sich vom Standard ASCII-Symboltabelle, dass die Steuerzeichen, die in eine Konsole / Pseudoterminal / vim über die eingefügt werden STRG Schlüssel (haha), kann dort gefunden werden. In C und den meisten anderen Sprachen verwenden Sie normalerweise die Oktalcodes, um diese Zeichen darzustellen.

Wenn Sie wirklich wissen wollen, woher das kommt: http://www.linusakesson.net/programming/tty/.
Dies ist der beste Link, den Sie zu diesem Thema finden werden, aber Vorsicht: Es gibt Drachen.


TL; DR

Gewöhnlich foo = \n, und bar = \r.


65
2017-09-23 14:00



Sie müssen verwenden

:%s/,/^M/g

Um das zu bekommen ^M Zeichen, drücken Sie Strg  v gefolgt von Eingeben


45
2017-09-16 11:30



\r kann die Arbeit hier für Sie erledigen.


27
2017-09-16 11:21



Mit Vim unter Windows verwenden Strg+Q anstelle von Strg+V


20
2017-09-16 11:45



Von der Sonnenfinsternis, dem ^M Zeichen können in eine Zeile eingebettet werden, und Sie möchten sie in Zeilenumbrüche konvertieren.

:s/\r/\r/g

8
2017-09-06 17:53



Aber wenn man ersetzen muss, dann funktioniert folgendes

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

im obigen wird jede nächste Zeile durch die nächste Zeile und dann | - und wieder eine nächste Zeile ersetzt. Dies wird in Wiki-Tabellen verwendet. wenn der Text wie folgt lautet:

line1
line2
line3

wird geändert in

line1
|-
line2
|-
line3

5
2018-02-07 08:09



Dies ist die beste Antwort für die Art, wie ich denke, aber es wäre schöner in einer Tabelle gewesen: https://stackoverflow.com/a/12389839/962394.

Also, Umformulierung:

Sie müssen verwenden \r einen Zeilenvorschub verwenden (ascii 0x0a, der Unix-Newline) in einem Regex-Ersatz, aber das ist typisch für den Ersatz - Sie sollten normalerweise weiterhin erwarten, zu verwenden \n für Zeilenvorschub und \r für den Wagenrücklauf.

Dies liegt daran, dass vim verwendet wurde \n in einem Ersatz den NIL Charakter (ascii 0x00). Du hättest erwartet, dass NIL es war \0 stattdessen, befreiend \n für seine übliche Verwendung für Zeilenvorschub, aber \0 hat bereits eine Bedeutung in Regex Ersatz, so dass es verschoben wurde \n. Daher geht es weiter, um auch den Newline zu verschieben \n zu \r (was in einem Regex-Muster das Wagenrücklaufzeichen ist, ascii 0x0d).

Zeichen | ASCII-Code | C Darstellung | Regex-Übereinstimmung | Regex-Ersatz
------------------------- + ------------ + ----------- ------- + ------------- + ------------------------
Null | 0x00 | \ 0 | \ 0 | \ n
Zeilenvorschub (unix newline) | 0x0a | \ n | \ n | \ r
Wagenrücklauf | 0x0d | \ r | \ r | <unbekannt>

NB: ^M (Ctrl-V Ctrl-M auf Linux) fügt eine neue Zeile, wenn sie in einem regex Ersatz verwendet anstelle eines Wagenrücklauf wie andere empfohlen haben (ich habe gerade versucht).

Beachten Sie auch, dass vim das Zeilenvorschubzeichen beim Speichern in eine Datei basierend auf seinen Dateiformateinstellungen übersetzt, was die Inhalte verwirren könnte.


5
2018-04-08 12:15



Wenn Sie für eine ganze Datei benötigen, wurde mir auch vorgeschlagen, dass Sie es über die Befehlszeile versuchen könnten

sed 's/\\n/\n/g' file > newfile

4
2018-02-09 23:01



Heres die Antwort, die für mich funktionierte. Von diesem Typen

- Zitat http://jaysonlorenzen.wordpress.com/2009/04/28/use-vi-editor-to-insert-newline-char-in-replace/


Etwas anderes muss ich tun und kann mich nicht erinnern und muss dann aufschauen.

Um ein neues Zeilenzeichen in eine Suche einzufügen und zu ersetzen, gehen Sie folgendermaßen vor:

:% s / look_for / replace_with ^ M / g 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 "ctl-V" ein und danach (alle Tasten freigeben) drücken Sie die "Enter" -Taste.



2
2018-02-03 19:31