Warum ist \ ra Newline für Vim?

254

Aus Frage Wie ersetze ich ein Zeichen für eine neue Zeile in Vim? . Sie müssen \ r verwenden, wenn Sie Text für eine neue Zeile wie diese ersetzen

:%s/%/\r/g

Wenn Sie jedoch das Ende von Zeilen und Zeilenumbrüchen für ein Zeichen ersetzen, können Sie Folgendes tun:

:%s/\n/%/g 

Welcher Abschnitt des Handbuchs dokumentiert diese Verhaltensweisen und welche Gründe stecken dahinter?

Vinko Vrsalovic
quelle
1
Wozu %beim Suchen und Ersetzen?
Qed
7
@qed: Standardmäßig :swird die Ersetzung nur auf die aktuelle Zeile angewendet . :%sLässt es die gesamte Datei adressieren. Mehr .
c24w
3
+ c24w Ich denke, er bezieht sich auf das '%' zwischen den Schrägstrichen, wobei das erste Beispiel das '%' am Suchort und am Ersetzungsort im zweiten Beispiel ist, aber @qed, um Ihre Frage zu beantworten, diese '%' 's sind buchstäblich abgestimmt.
RastaJedi

Antworten:

155

Aus vim docs zu Mustern :

\r entspricht <CR>

\n stimmt mit einem Zeilenende überein - Beim Abgleichen in einer Zeichenfolge anstelle von Puffertext wird ein wörtliches Zeilenumbruchzeichen abgeglichen.

pjz
quelle
41
Für mich ist der Punkt der Verwirrung, dass \ r und \ n unterschiedliche Bedeutungen haben, wenn das Suchmuster und das Ersatzmuster verwendet werden.
Dlamblin
3
@dlamblin Yup! Siehe meine Antwort :)
Begrenzte Versöhnung
207

Von http://vim.wikia.com/wiki/Search_and_replace :

Bei der Suche

...

\nist Zeilenumbruch, \rist CR(Wagenrücklauf = Ctrl-M= ^M)

Beim Ersetzen

...

\rist newline, \nist ein Null-Byte ( 0x00).

Begrenzte Versöhnung
quelle
6
Diese Antwort hat mir am meisten geholfen. Weitere Informationen :h :s%, insbesondere den letzten Absatz. (via :h :s)
dipnlik
113

Ein weiterer Aspekt dabei ist, dass \0, was traditionell NULL ist s//\0/, "das gesamte übereinstimmende Muster" bedeutet. (Was übrigens überflüssig ist und länger als &).

  • Sie können also nicht \0bedeuten NULL, also verwenden Sie\n
  • Sie können also nicht \nbedeuten \n, also verwenden Sie \r.
  • Sie können es also nicht \rso meinen \r, aber ich weiß nicht, wer dieses Zeichen absichtlich hinzufügen möchte.

-

rking
quelle
1
Guter Punkt! Dies ist also ein Hack um \ 0 - Rückverweis auf die 0-te verschachtelte Gruppe - ganze Regexp. Dies ist eine sehr gute Antwort, aber es enttäuscht mich, dass ich \ r nicht als Ersatz verwenden kann ... (was bedeutet: # (13) einfügen, zum Beispiel in eine "normale" Datei (== Unix-EOLs).
Tomasz Gandor
3
OK, die Antwort finden Sie in den Vim-Dokumenten. Entkomme einfach \ ^ M oder \ <CR> mit einem normalen Backslash. Nett. ----- <CR> trennt die Linie an dieser Stelle in zwei Teile (geben Sie <CR> als STRG-V <Eingabe> ein) s <CR> \ r idem -------- s / \ r \ < CR> Einfügen eines Wagenrücklaufs (STRG-M) (Geben Sie die <CR> als STRG-V <Eingabe> ein) s / \ <CR>
Tomasz Gandor
16
"Ein anderer Aspekt"? Du bist zu bescheiden! Genau zu erklären, warum dies geschieht, ist eine überlegene Antwort für alle, die nur sagen, wie man es umgeht. +1
underscore_d
Das ist ehrlich gesagt wirklich ein großartiger Einblick in warum \nverschiedene Bedeutungen auf der Suche hat und Muster ersetzen. Fantastische Antwort.
ZeroKnight
47

:help NL-used-for-Nul

Technisches Detail:

<Nul>Zeichen in der Datei werden wie <NL>im Speicher gespeichert . Im Display werden sie als " ^@" angezeigt . Die Übersetzung erfolgt beim Lesen und Schreiben von Dateien. Um a <Nul>mit einem Suchmuster abzugleichen, können Sie einfach STRG- @ oder " STRG-V 000" eingeben . Dies ist wahrscheinlich genau das, was Sie erwarten. Intern wird das Zeichen <NL>im Suchmuster durch ein Zeichen ersetzt . Was ungewöhnlich ist, ist, dass durch Eingabe von STRG-V STRG-J auch a eingefügt wird <NL>, wodurch auch <Nul> in der Datei nach a gesucht wird. {Vi kann überhaupt keine <Nul>Zeichen in der Datei verarbeiten}


Aristoteles Pagaltzis
quelle
10

Öffnen :h :sSie zunächst den Abschnitt "4.2 Ersatz" der Dokumentation zu "Änderung". Folgendes akzeptiert der Befehl:

:[range]s[ubstitute]/{pattern}/{string}/[flags] [count]

Beachten Sie die Beschreibung zu patternundstring

Für das {pattern}sehen |pattern|.
{string}kann eine wörtliche Zeichenfolge oder etwas
Besonderes sein; siehe |sub-replace-special|.

Jetzt wissen Sie also, dass das Suchmuster und das Ersetzungsmuster unterschiedlichen Regeln folgen. Wenn Sie dem Link zu folgen |pattern|, gelangen Sie zu dem Abschnitt, in dem die gesamten in Vim verwendeten regulären Ausdrucksmuster erläutert werden.

In der Zwischenzeit gelangen |sub-replace-special|Sie zum Unterabschnitt "4.2 Ersetzen", der die Ersetzungsmuster enthält, darunter \rZeilenumbruch / -teilung.

(Die Verknüpfung zu diesem Teil des Handbuchs lautet :h :s%)

Syockit
quelle