Domanda Come sostituire un personaggio con una nuova riga in Vim?


Sto provando a sostituirli ciascuno , nel file corrente con una nuova riga:

:%s/,/\n/g 

Ma inserisce ciò che sembra un ^@ invece di una nuova riga effettiva. Il file non è in modalità DOS o altro.

Cosa dovrei fare?

Se sei curioso, come me, controlla la domanda Perché è una nuova riga per Vim? anche.


1585
2017-09-16 11:19


origine


risposte:


Uso \r invece di \n.

Sostituendo con \n inserisce un carattere nullo nel testo. Per ottenere una nuova riga, utilizzare \r. quando ricerca per una nuova riga, useresti ancora \n, però. Questa asimmetria è dovuta al fatto che \n e \r  fai cose leggermente diverse:

\n corrisponde alla fine della riga (newline), mentre \r corrisponde a un ritorno a capo. D'altra parte, nelle sostituzioni \n inserisce un carattere nullo mentre \r inserisce una nuova riga (più precisamente, viene trattata come input <CR>). Ecco un piccolo esempio non interattivo per illustrare questo, utilizzando la funzione della riga di comando di Vim (in altre parole, è possibile copiare e incollare quanto segue in un terminale per eseguirlo). xxd mostra un dump esadecimale del file risultante.

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.

In altre parole, \n ha inserito il byte 0x00 nel testo; \r ha inserito il byte 0x0a.


2072
2017-09-16 11:21



Ecco il trucco:

Per prima cosa, imposta la tua sessione vi (m) per consentire la corrispondenza del modello con caratteri speciali (es .: newline). Probabilmente vale la pena di inserire questa riga nel tuo file .vimrc o .exrc.

:set magic

Quindi, fai:

:s/,/,^M/g

Prendere il ^M carattere, tipo Controllo-v e colpisci accedere. Sotto Windows, fallo Controllo-q, accedere. L'unico modo in cui posso ricordare questi è ricordando quanto poco senso abbiano:

UN: Quale sarebbe il peggior personaggio di controllo da utilizzare per rappresentare una newline?

B: O q (perché in genere significa "Esci") o v perché sarebbe così facile da digitare Controllo-c per errore e uccidi l'editor.

UN: Fallo così.


166
2017-09-25 23:40



Nella sintassi s/foo/bar  \r e \n hanno significati diversi, a seconda del contesto.


Per foo:
\ n = newline
\ r = CR (ritorno a capo = Ctrl-M = ^ M)

Per bar:
\ r = è newline
\ n = byte null (0x00).


Ho visto domande su cose del genere abbastanza spesso in passato, ea volte in futuro quasi nessuno saprà nulla su questa roba alla fine ...

Per richiesta "popolare":

Ecco una lista dei Caratteri di controllo ASCII, inseriscili vim attraverso CTRLvCTRL---chiave---.
In bash o le altre shell unix / linux digitano semplicemente CTRL---chiave---. Provare CTRLM in bash, è come colpire ACCEDERE, poiché la shell capisce cosa si intende, anche se i sistemi linux usano i Line Feed per delimitare la linea. È solo il controllo char per Line Feed CTRL-A, che è legato a 'saltare all'inizio della linea' in bash.

Per inserire letterali in bash, CTRLv funzionerà anche

Prova in bash:

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

Questo usa Sequenze di escape ANSI, inserisci i due ^[è via CTRLvESC.

Potresti anche provare CTRLvCTRLmACCEDERE, che ti darà questo:

bash: $'\r': command not found

Ricorda il \r da sopra? :>

Il Caratteri di controllo ASCII la lista è diversa dallo standard tabella dei simboli ascii, in quanto i caratteri di controllo, che vengono inseriti in una console / pseudoterminal / vim tramite il CTRL chiave (haha), può essere trovato lì. Mentre in C e nella maggior parte delle altre lingue di solito usi i codici ottali per rappresentare questi "personaggi".

Se vuoi davvero sapere da dove viene tutto questo: http://www.linusakesson.net/programming/tty/.
Questo è il miglior link che troverai su questo argomento, ma attenzione: ci sono i draghi.


TL; DR

Generalmente foo = \n, e bar = \r.


65
2017-09-23 14:00



Devi usare

:%s/,/^M/g

Prendere il ^M carattere, premere Ctrl  v seguito da accedere


45
2017-09-16 11:30



\r può fare il lavoro qui per te.


27
2017-09-16 11:21



Con Vim su Windows Ctrl+Q al posto di Ctrl+V


20
2017-09-16 11:45



Da eclissi, il ^M i caratteri possono essere incorporati in una riga e si desidera convertirli in newline.

:s/\r/\r/g

8
2017-09-06 17:53