Frage

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

:%s/,/\n/g 

Aber es fügt, was wie ein ^@ sieht anstelle eines tatsächlichen Newline. Die Datei ist nicht im DOS-Modus oder nichts.

Was soll ich tun?

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

War es hilfreich?

Lösung

Verwendung \r statt \n.

Durch Einsetzen von \n fügt ein Null-Zeichen in den Text. Um eine neue Zeile zu erhalten, verwenden \r. Wenn Suche für eine neue Zeile, dann würden Sie noch \n verwenden, jedoch. Diese Asymmetrie ist aufgrund der Tatsache, dass \n und \r tun etwas andere Dinge :

\n übereinstimmt, ein Ende der Leitung (Neue-Zeile), wohingegen \r einen Wagenrücklauf übereinstimmt. Auf der anderen Seite, in Ersetzungen \n ein Nullzeichen fügt während \r eine neue Zeile einfügt (genauer gesagt, ist es als Eingangs behandelt ). Hier ist ein kleines, nicht-interaktives Beispiel, dies zu veranschaulichen, mit der Vim-Befehlszeile-Funktion (mit anderen Worten, können Sie kopieren und die folgend in ein Terminal einfügen, um sie auszuführen). xxd zeigt eine 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, hat \n das Byte 0x00 in den Text eingefügt; \r hat das Byte 0x0a eingefügt.

Andere Tipps

Hier ist der Trick:

Zuerst stellen Sie vi (m) Sitzung Musterabgleich zu ermöglichen, mit Sonderzeichen (zB: Newline). Es ist wahrscheinlich lohnt sich, diese Zeile in Ihrer .vimrc oder .exrc Datei setzen.

:set magic

Als nächstes tun:

:s/,/,^M/g

Um die ^M Charakter zu erhalten, geben Sie Kontrolle - v und drücken Sie Enter . Unter Windows tun Kontrolle - q , Enter . Die einzige Art, wie ich diese erinnern kann, ist durch die Erinnerung, wie wenig Sinn machen sie:

  

A: Was das Schlimmste Kontrolle Zeichen sein würde zu verwenden eine neue Zeile stellen

     

B: Entweder q (weil es in der Regel bedeutet, "Beenden") oder v, weil es so einfach wäre Kontrolle eingeben - c versehentlich und töten der Editor.

     

A: Machen Sie es so

.

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


kurz:

Für foo:
\ N = Zeilenvorschub (LF auf Linux / mac, CRLF Windows)
\ R = Wagenrücklauf (CR)

Für bar:
\ R = ist Newline
\ N = null Byte.

mehr: (mit ascii Zahlen)

NUL = 0x00 = 0 = STRG @
LF = 0x0A = 10 = STRG J
CR = 0x0D = 13 = STRG M

Hier

ist eine Liste der ASCII-Steuerzeichen , einfügen sie in vim über STRG v STRG --- --- Taste .
In bash oder anderen Unix / Linux-Schalen geben Sie einfach STRG --- --- Taste . Versuchen STRG M in bash, ist es das gleiche wie Schlagen ENTER , wie die Schale realisiert, was gemeint ist, obwohl Linux-Systeme verwenden Line-Feeds für Linie Zu.

wörtliche die in bash einzufügen, voranstellt sie mit STRG v wird auch funktionieren.

Versuchen in bash:

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

Dieses verwendet ANSI Escape-Sequenzen , setzen Sie die beiden ^[ die über STRG v ESC .

Sie könnten auch versuchen STRG v STRG m ENTER , die geben Sie dies:

bash: $'\r': command not found

Denken Sie daran, die \r von oben? :>

Das ASCII-Steuerzeichen Liste unterscheidet sich von einer vollständigen < a href = "http://ascii-code.com/" rel = "noreferrer"> ASCII Symboltabelle , dadurch, dass die Steuerzeichen, die in eine Konsole / Pseudoterminal / Vim über den STRG -Taste (haha), sind dort zu finden. Während in C und die meisten anderen Sprachen, die Sie in der Regel die Oktalcodes verwenden, um diese ‚Zeichen‘ darstellen.

Wenn Sie wirklich wissen wollen, wo das alles kommt von: http://www.linusakesson.net / Programmierung / tty / .
Dies ist der beste Link kommen Sie zu diesem Thema über, aber Vorsicht:. Es werden Drachen


TL; DR

In der Regel foo = \n und bar = \r.

Sie müssen verwenden

:%s/,/^M/g

Um die ^M Charakter zu bekommen, drücken Sie Strg v gefolgt von Enter

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

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

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

Also, umformuliert wird:

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

Das ist, weil vim \n in einem Ersatz verwendet, um das NIL-Zeichen (ASCII 0x00) zu bedeuten. Man könnte erwarten NIL statt \0 worden zu sein, \n für seine übliche Verwendung für Zeilenvorschub zu befreien, aber \0 hat bereits eine Bedeutung in regex Ersatz, so dass es verschoben wurde \n. Daher geht dann weiter, um auch die Neue-Zeile von \n zu verschieben \r (was in einem RegexMuster ist das Wagenrücklaufzeichen, ASCII- 0x0d).

character                | ascii code | C representation | regex match | regex replacement
-------------------------+------------+------------------+-------------+------------------------
nil                      | 0x00       | \0               | \0          | \n
line feed (unix newline) | 0x0a       | \n               | \n          | \r
carriage return          | 0x0d       | \r               | \r          | <unknown>

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 die Zeilenvorschub-Zeichen übersetzen, wenn es auf den Dateiformateinstellungen Datei speichert auf der Grundlage und das könnte Angelegenheiten verwirren.

Von Eclipse können die ^M Zeichen in einer Zeile eingebettet werden, und Sie wollen, dass sie neue Zeilen konvertieren.

:s/\r/\r/g

Wenn man aber ersetzen hat dann Sache Werke nach

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

in der über jedem nächste Zeile mit der nächsten Zeile ersetzt und dann | - und wieder eine nächste Zeile. Dies wird in der Wiki-Tabellen verwendet. wenn der Text lautet wie folgt:

line1
line2
line3

wird geändert

line1
|-
line2
|-
line3

Wenn Sie für eine ganze Datei tun müssen, war es mir auch vorgeschlagen, dass Sie von der Kommandozeile versuchen könnten

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

Heres die Antwort, die für mich gearbeitet. Von diesem Typ

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


Etwas anderes habe ich zu tun und kann sich nicht erinnern, und dann nach oben schauen.

In vi ein Newline-Zeichen in einer Suche einzufügen und ersetzen, gehen Sie wie folgt vor:

:% s / look_for / replace_with ^ M / g der obige Befehl würde alle Instanzen von „look_for“ mit „replace_with \ n“ (mit \ n bedeutet Newline)

ersetzen

die „^ M“ erhalten, geben Sie die Tastenkombination „Strg-V“ dann nach, dass (alle Tasten loslassen) drücken Sie die „Enter“ -Taste.


Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top