Vim - come sostituire una nuova riga \ n con due \ n


34

Nell'editor vim, voglio sostituire un carattere di nuova riga (\ n) con due caratteri di nuova riga (\ n \ n) usando la modalità di comando di vim.

Contenuto del file di input:

This is my first line.
This is second line.

Comando che ho provato:

:%s/\n/\n\n/g

sostituisce la stringa con caratteri indesiderati come

This is my first line.^@^@This is second line.^@^@

Quindi ho provato il seguente comando

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

Funziona correttamente. Puoi spiegare perché funziona bene con il secondo comando?



2
FYI: C'è anche un Vi e Vim (beta) SE .
Dubu,

2
Nota a margine, non è necessario utilizzare /come separatore. Questo è più leggibile::%s;\n;\n\n;g
DJMcMayhem il

1
Cerca \n, sostituire con \r\r, :% s/\n/\r\r/g: stackoverflow.com/a/71334/911945
Anton Tarasenko

Risposte:


47

Stranamente, \nin vim per la sostituzione non significa newline, ma null. ASCII nul is ^@( control@).

Storicamente, vi sostituisce ^M( controlM) come la fine della linea, che è la nuova riga. vim ha aggiunto un'estensione \r(come il linguaggio C) per significare lo stesso di ^M, ma gli sviluppatori hanno scelto di rendere \nnull il valore quando si sostituisce il testo. Ciò non è coerente con il suo utilizzo nelle ricerche , che trovano una nuova riga.

Ulteriori letture:


7

Prova questo: %s/$/^V^M/(dove si ^Vtrova Ctrl-Ved ^Mè Ctrl-M- quando si digita ^V, stamperà un ^carattere, quindi lo spazio indietro su di esso e quindi quando si digita ^Mapparirà come ^M... il Ctrl-V è il carattere successivo letterale tty standard - eseguire il comando stty -asu mostra i caratteri speciali del tuo tty).


In effetti, i più esperti lo sapranno per la conversione sempre richiesta dal CRLF come alternativa all'abbandono e all'uso di dos2unix o simili. L'uso di Ctrl-V è una lezione di 1 ° giorno.
mckenzm,

5

vimutilizzare \nper rappresentare un carattere null \0in memoria, che il modo in cui il vimfile handle contiene un carattere null (mentre vinon può).

L'uso della \nsola corrispondenza della fine della riga nel buffer, non della nuova riga nella stringa quando si usa in espressione.

Vedi : h NL-used-for-Null e : h CR-used-for-NL per maggiori dettagli.


1

Testato con Neovim ( nvim) e Vimversioni

NVIM v0.3.0
VIM - Vi IMproved 8.1

Rimuovi una nuova riga:

cell
allele
rs2981578
fgfr2

Qui, \ncorrisponde alle nuove righe (per inserire una nuova riga, utilizzare \r):

:'<,'>s/\n/|/g

cell|allele|rs2981578|fgfr2

Aggiungi una nuova riga:

No:

cell|allele|rs2981578|fgfr2

:'<,'>s/\n/|/g

cell^@allele^@rs2981578^@fgfr2

^@è un segno diacritico per LF (avanzamento riga; vedere http://vimhelp.appspot.com/digraph.txt.html#digraphs-default )

Sì:

cell|allele|rs2981578|fgfr2

:'<,'>s/|/\r/g

cell
allele
rs2981578
fgfr2

Per rispondere alla domanda del PO (come sostituirne uno \ncon due \n\n), basta aggiungerne un altro \r:

cell
allele
rs2981578
fgfr2

:'<,'>s/\n/\r\r/g

cell

allele

rs2981578

fgfr2

... cioè abbina la nuova riga originale ( \n) e sostituiscila con due nuove righe / ritorni a capo ( \r\r).

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.