it-swarm-eu.dev

So ersetzen Sie einen Charakter in Vim durch eine neue Zeile

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

:%s/,/\n/g 

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

Was soll ich machen?

Wenn Sie neugierig sind, wie ich, überprüfen Sie die Frage Warum ist eine neue Zeile für Vim?.

1818
Vinko Vrsalovic

Verwenden Sie \r anstelle von \n.

Durch Ersetzen durch \n wird ein Nullzeichen in den Text eingefügt. Verwenden Sie \r, um eine neue Zeile zu erhalten. Wenn Sie nach einer neuen Zeile suchen , verwenden Sie dennoch \n. Diese Asymmetrie ist auf die Tatsache zurückzuführen, dass \n und \retwas andere Dinge tun :

\n entspricht einem Zeilenende (Newline), während \r einem Wagenrücklauf entspricht. Andererseits fügt \n in Substitutionen ein Nullzeichen ein, während \r eine neue Zeile einfügt (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.

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.

2375
Konrad Rudolph

Hier ist der Trick:

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

:set magic

Als nächstes machen Sie:

:s/,/,^M/g

Geben Sie ein, um das ^M -Zeichen zu erhalten Control-v und schlagen Enter. Unter Windows tun Control-qEnter. Ich kann mich nur daran erinnern, wie wenig Sinn sie ergeben:

A: Was wäre das schlechteste Steuerzeichen, um eine neue Zeile darzustellen?

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

A: Mach es so.

190
Logan

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


kurz:

Für foo:
\n = newline (LF unter Linux/Mac, CRLF unter Windows)
\r = Wagenrücklauf (CR)

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

länger: (mit ASCII-Nummern)

NUL = 0x00 = 0 = CTRL@
LF = 0x0A = 10 = CTRLJ
CR = 0x0D = 13 = CTRLM

Hier ist eine Liste der ASCII-Steuerzeichen , fügen Sie sie in vim über ein CTRLvCTRL---key---.
In bash oder den anderen Unix/Linux-Shells einfach eingeben CTRL---key---. Versuchen CTRLM In Bash ist es dasselbe wie Schlagen ENTER, wie die Shell erkennt, was gemeint ist, obwohl Linux-Systeme Line Feeds zur Begrenzung von Zeilen verwenden.

Um Literalen in bash einzufügen, müssen Sie ihnen Folgendes voranstellen CTRLv wird auch funktionieren.

Versuchen Sie es in bash:

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

Dies verwendet ANSI-Escape-Sequenzen , füge die zwei ^[ 's über ein CTRLvESC.

Sie könnten es auch versuchen CTRLvCTRLmENTER, was dir folgendes geben wird:

bash: $'\r': command not found

Erinnerst du dich an den \r von oben? :>

Diese ASCII-Steuerzeichen Liste unterscheidet sich von einer vollständigen ASCII-Symboltabelle darin, dass die Steuerzeichen, die in eine Konsole/Pseudoterminal/vim über die eingefügt werden CTRL Schlüssel (haha), kann dort gefunden werden. Während Sie in C und den meisten anderen Sprachen normalerweise die Oktalcodes verwenden, um diese 'Zeichen' darzustellen.

Wenn Sie wirklich wissen möchten, woher das alles kommt: http://www.linusakesson.net/programming/tty/ .
Dies ist der beste Link zu diesem Thema, aber Vorsicht: Es gibt Drachen.


TL; DR

Normalerweise foo = \n und bar = \r.

89
sjas

Sie müssen verwenden

:%s/,/^M/g

Um das Zeichen ^M abzurufen, drücken Sie Ctrlv gefolgt von Enter

50
dogbane

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

34
Lasar

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

22
grantc

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

Also, umformulieren:

Sie müssen \r verwenden, um einen Zeilenvorschub (ascii 0x0a, der Unix-Zeilenvorschub) in einem regulären Ausdruck zu verwenden. Dies ist jedoch eine Besonderheit des Austauschs. Normalerweise sollten Sie weiterhin \n für Zeilenvorschub und \r für Wagenrücklauf verwenden.

Dies liegt daran, dass vim \n als Ersatz für das NIL-Zeichen (ascii 0x00) verwendet hat. Sie haben möglicherweise erwartet, dass NIL stattdessen \0 war und \n für die übliche Verwendung als Zeilenvorschub freigegeben hat, aber \0 hat bereits eine Bedeutung bei regulären Textersetzungen, sodass es zu \n verschoben wurde. Daher wird dann auch die neue Zeile von \n nach \r verschoben (was in einem regulären Ausdruck das Wagenrücklaufzeichen ist, ascii 0x0d).

 Zeichen | ASCII-Code | C Darstellung | Regex Match | Regex-Ersatz 
 ------------------------- + ------------ + ---- -------------- + ------------- + --------------------- --- 
 nil | 0x00 |\0 |\0 |\n 
 Zeilenvorschub (Unix Newline) | 0x0a |\n |\n |\r 
 Wagenrücklauf | 0x0d |\r |\r | <unbekannt> 

NB: ^M (Strg-V Strg-M unter Linux) fügt einen Zeilenumbruch ein, wenn ein regulärer Ausdruck anstelle eines Zeilenumbruchs verwendet wird (ich habe es gerade versucht).

Beachten Sie auch, dass vim das Zeilenvorschubzeichen übersetzt, wenn es auf der Grundlage seiner Dateiformateinstellungen in einer Datei gespeichert wird. Dies kann zu Problemen führen.

10
codeshot

In Eclipse können die Zeichen ^M in eine Zeile eingebettet werden, und Sie möchten sie in Zeilenumbrüche konvertieren.

:s/\r/\r/g
10
rickfoosusa

Aber wenn man ersetzen muss, dann funktioniert folgendes

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

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

line1
line2
line3

wird geändert zu

line1
|-
line2
|-
line3
7

Wenn Sie für eine ganze Datei tun müssen, wurde mir auch vorgeschlagen, dass Sie über die Befehlszeile versuchen könnten

sed 's/\\n/\n/g' file > newfile
6
Evan Donovan

Hier ist die Antwort, die für mich funktioniert hat. Von diesem Typ

---- Zitieren 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 nachschlagen.

Führen Sie in vi die folgenden Schritte aus, um ein Zeilenumbruchzeichen in ein Suchen und Ersetzen einzufügen:

:% 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 (lassen Sie alle Tasten los) drücken Sie die "Enter" -Taste.


4
user407749