Perché \ ra newline per Vim?


254

Dalla domanda Come sostituire un personaggio per una nuova riga in Vim? . Devi usare \ r quando sostituisci il testo per una nuova riga, in questo modo

:%s/%/\r/g

Ma quando si sostituisce la fine di linee e nuove righe per un personaggio, è possibile farlo come:

:%s/\n/%/g 

Quale sezione del manuale documenta questi comportamenti e qual è il ragionamento alla base?


1
A cosa serve la %ricerca e la sostituzione?
Q

7
@qed: per impostazione predefinita :sapplicherà la sostituzione solo alla riga corrente. :%slo fa indirizzare l'intero file. Di più .
c24w,

3
+ c24w Penso che si riferisca al '%' tra le barre, il primo esempio che '%' si trova nella posizione di ricerca e nella posizione di sostituzione nel secondo esempio, ma @qed per rispondere alla tua domanda, quelle '% sono abbinati letteralmente.
RastaJedi,

Risposte:


155

Dai documenti di vim sugli schemi :

\r corrisponde a <CR>

\n corrisponde a un fine riga - Quando si esegue la corrispondenza in una stringa anziché nel testo buffer, viene trovato un carattere letterale di nuova riga.


41
Per me il punto di confusione è che \ r e \ n significano cose diverse quando usato è il modello di ricerca e il modello di sostituzione.
dlamblin,

3
@dlamblin Yup! Vedi la mia risposta :)
Espiazione limitata il


114

Un altro aspetto di questo è che \0, che è tradizionalmente NULL, viene preso in considerazione s//\0/"l'intero modello abbinato". (Che, a proposito, è ridondante e più lungo di &).

  • Quindi non puoi usare \0per dire NULL, quindi usi\n
  • Quindi non puoi usare \nper dire \n, quindi usi \r.
  • Quindi non puoi usare \rper dire \r, ma non so chi vorrebbe aggiungere quel carattere apposta.

-☈


1
Buon punto! Quindi questo è un trucco intorno a \ 0 - backreference al 0 ° gruppo nidificato - regexp intero. Questa è un'ottima risposta, ma mi delude, che non posso usare \ n in sostituzione ... (significato: inserire # (13), ad esempio in un file "normale" (== EOL unix).
Tomasz Gandor,

3
OK, la risposta è nei documenti di Vim. Basta sfuggire a \ ^ M o \ <CR>, con una normale barra rovesciata. Bello. ----- <CR> dividere la linea in due a questo punto (Digitare <CR> come CTRL-V <Invio>) s <CR> \ r idem -------- s / \ r \ < CR> inserisci un ritorno a capo (CTRL-M) (digita <CR> come CTRL-V <Invio>) s / \ <CR>
Tomasz Gandor,

16
"Un altro aspetto"? Sei troppo modesto! Spiegare precisamente_perché_ ciò accada fornisce una risposta superiore a tutti quelli che dicono semplicemente come aggirarlo. +1
underscore_d

Questa è davvero una grande intuizione sul perché \nha diversi significati nella ricerca e nella sostituzione dei modelli. Risposta fantastica.
ZeroKnight

47

:help NL-used-for-Nul

Scheda tecnica:

<Nul>i caratteri nel file vengono archiviati come <NL>in memoria. Sul display vengono visualizzati come " ^@". La traduzione viene eseguita durante la lettura e la scrittura di file. Per abbinare <Nul>a uno schema di ricerca puoi semplicemente inserire CTRL- @ o " CTRL-V 000". Questo è probabilmente proprio quello che ti aspetti. Internamente il personaggio viene sostituito con un <NL>nel modello di ricerca. Ciò che è insolito è che digitando CTRL-V CTRL-J si inserisce anche a <NL>, quindi si cerca anche <Nul> nel file. {Vi non riesce a gestire affatto i <Nul>caratteri nel file}



10

Prima di tutto, apri :h :sper vedere la sezione "4.2 Sostituzione" della documentazione su "Modifica". Ecco cosa accetta il comando:

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

Notare la descrizione di patternestring

Per il {pattern}vedere |pattern|.
{string}può essere una stringa letterale o qualcosa di
speciale; vedi |sub-replace-special|.

Quindi ora sai che il modello di ricerca e i modelli di sostituzione seguono regole diverse. Se segui il link a |pattern|, ti porta alla sezione che spiega tutti gli schemi di regexp usati in Vim.

Nel frattempo, |sub-replace-special|ti porta alla sottosezione di "4.2 Sostituzione", che contiene i modelli per la sostituzione, tra cui l' \rinterruzione / divisione.

(Il collegamento a questa parte del manuale è :h :s%)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.