Domanda

Sto cercando di sostituirli ciascuno , nel file corrente con una nuova riga:

:%s/,/\n/g 

Ma inserisce quello che sembra a ^@ invece di un vero e proprio ritorno a capo.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.

È stato utile?

Soluzione

Utilizzo \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, utilizzeresti comunque \n, Tuttavia.Questa asimmetria è dovuta al fatto che \n E \r fare cose leggermente diverse:

\n corrisponde a una fine di riga (nuova riga), mentre \r corrisponde a un ritorno a capo.D’altronde nelle sostituzioni \n inserisce un carattere null mentre \r inserisce un ritorno a capo (più precisamente, viene trattato come input <CR>).Ecco un piccolo esempio non interattivo per illustrarlo, utilizzando la funzionalità della riga di comando di Vim (in altre parole, puoi copiare e incollare quanto segue in un terminale per eseguirlo). xxd mostra un hexdump 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 nel testo il byte 0x00; \r ha inserito il byte 0x0a.

Altri suggerimenti

Ecco il trucco:

Innanzitutto, imposta la sessione vi(m) per consentire la corrispondenza dei modelli con caratteri speciali (ad esempio:nuova linea).Probabilmente vale la pena inserire questa riga nel file .vimrc o .exrc.

:set magic

Successivamente, esegui:

:s/,/,^M/g

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

UN: Quale sarebbe il peggior carattere di controllo da utilizzare per rappresentare un ritorno a capo?

B: O q (perché di solito significa "Esci") o v perché sarebbe così facile da scrivere Controllo-C per errore e uccidere l'editore.

UN: Fallo così.

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


corto:

Per foo:
= nuova riga (LF su linux/mac, CRLF su Windows)
= ritorno a capo (CR)

Per bar:
= è una nuova riga
= byte nullo.

più a lungo:(con numeri ascii)

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

Ecco un elenco dei Caratteri di controllo ASCII, inserirli vim attraverso CTRLvCTRL---chiave---.
In bash o le altre shell Unix/Linux digitano semplicemente CTRL---chiave---.Tentativo CTRLM in bash è come colpire ACCEDERE, poiché la shell capisce cosa si intende, anche se i sistemi Linux utilizzano Line Feeds per delimitare le righe.

Per inserire valori letterali in bash, anteponendoli con CTRLv funzionerà anche.

Prova in bash:

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

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

Potresti anche provarci CTRLvCTRLMACCEDERE, che ti darà questo:

bash: $'\r': command not found

Ricorda il \r da sopra?:>

Questo Caratteri di controllo ASCII l'elenco è diverso da un elenco completo Tabella dei simboli ASCII, in quanto i caratteri di controllo, che vengono inseriti in una console/pseudoterminale/vim tramite il file CTRL la chiave (ahah), può essere trovata lì.Mentre in C e nella maggior parte degli altri linguaggi di solito si usano i codici ottali per rappresentare questi "caratteri".

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 draghi.


TL;DR

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

Devi usare

:%s/,/^M/g

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

\r può fare il lavoro qui per te.

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

Questa è la risposta migliore per come penso, ma sarebbe stato più carino in una tabella: https://stackoverflow.com/a/12389839/962394.

Quindi, riformulando:

Devi usare \r per utilizzare un avanzamento riga (ascii 0x0a, la nuova riga unix) in una sostituzione regex ma questo è peculiare della sostituzione: normalmente dovresti continuare ad aspettarti di utilizzare \n per l'avanzamento riga e \r per il ritorno a capo.

Questo perché vim usava \n in sostituzione per indicare il carattere NIL (ascii 0x00).Potresti aspettarti che NIL lo fosse \0 invece, liberatorio \n per il suo uso abituale per l'avanzamento riga, ma \0 ha già un significato nelle sostituzioni delle espressioni regolari, quindi è stato spostato in \n.Quindi andando oltre per spostare anche la nuova riga da \n A \r (che in uno schema regex è il carattere di ritorno a capo, ascii 0x0d).

character                | ascii code | C representation | regex match | regex replacement
-------------------------+------------+------------------+-------------+------------------------
nil                      | 0x00       | \0               | \0          | \n
line feed (unix newline) | 0x0a       | \n               | \n          | \r
carriage return          | 0x0d       | \r               | \r          | <unknown>

NB: ^M (Ctrl-V Ctrl-M su Linux) inserisce una nuova riga quando viene utilizzato in una sostituzione regex anziché in un ritorno a capo come altri hanno consigliato (l'ho appena provato).

Si noti inoltre che vim tradurrà il carattere di avanzamento riga quando salva su file in base alle impostazioni del formato file e ciò potrebbe confondere le cose.

Dall'eclissi, il ^M i caratteri possono essere incorporati in una riga e desideri convertirli in caratteri di fine riga.

:s/\r/\r/g

Ma se si deve sostituire, la cosa successiva funziona

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

in quanto sopra ogni riga successiva viene sostituita con la riga successiva e poi |- e ancora con una riga successiva.Viene utilizzato nelle tabelle wiki.se il testo è il seguente:

line1
line2
line3

è cambiato in

line1
|-
line2
|-
line3

Se devi farlo per un intero file, mi è stato anche suggerito di provare dalla riga di comando

sed 's/\\n/\n/g' file > newfile

Ecco la risposta che ha funzionato per me.Da questo ragazzo

----citando http://jaysonlorenzen.wordpress.com/2009/04/28/use-vi-editor-to-insert-newline-char-in-replace/


Qualcos'altro che devo fare e non riesco a ricordare e quindi devo cercare.

In vi per inserire un carattere di nuova riga in una ricerca e sostituzione, procedi come segue:

:%s/look_for/sostituzione_with^m/g Il comando sopra sostituirà tutte le istanze di "look_for" con "sostituzione_with n" (con n che significa newline)

per ottenere "^M", inserire la combinazione di tasti "ctl-V", quindi (rilasciare tutti i tasti) premere il tasto "invio".


Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top