Cum pentru a înlocui un personaj de o linie nouă în Vim

Am'm încercarea de a înlocui fiecare", " în fișierul curent de o nouă linie:

:%s/,/\n/g 

Dar insertii de ceea ce pare a fi o ^@ în loc de un real newline. Fișierul nu este în modul DOS sau ceva.

Ce ar trebui să fac?

Daca esti curios, ca mine, check întrebarea de Ceeste \r un newline pentru Vim? la fel de bine.

Comentarii la întrebare (3)
Soluția

Uz \r în loc de \n.

Substituirea de \n inserează un caracter nul în text. Pentru a obține un newline, utilizat \r. Când căutare pentru un newline, ai mai utilizat \n, cu toate acestea. Această asimetrie se datorează faptului că \n și \r fac lucruri ușor diferite:

\n meciuri capăt de linie (newline), întrucât, \r meciurile retur de car. Pe de altă parte, în substituții \n inserează un caracter null, întrucât \r inserează o linie nouă (mai precis, acesta este tratat ca intrare <CR>). Aici e o mică, non-interactiv exemplu pentru a ilustra acest lucru, folosind Vim linie de comandă caracteristică (cu alte cuvinte, aveți posibilitatea să copiați și lipiți următorul text într-un terminal pentru a rula). xxd prezinta o hexdump a fișierului rezultat.

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.

Cu alte cuvinte, \n a introdus octet 0x00 în text; \r a introdus octet 0x0a.

Comentarii (16)

Aici's truc:

În primul rând, setați vi(m) sesiune pentru a permite model de potrivire cu caractere speciale (de exemplu: newline). L's, probabil, în valoare de a pune această linie în .vimrc sau .exrc fișier.

:set magic

Apoi, face:

:s/,/,^M/g

Pentru a obține ^M caracter, tip Control-v și a lovit Enter. Sub Windows, nu Control-q, Enter. Singurul mod în care pot aminti aceste este amintindu-și cât de puțin simț se face:

O: What ar fi cel mai rău de control-caracter utilizat pentru a reprezenta un newline?

B: Either " q "(pentru că, de obicei, înseamnă "Quit") sau " v " pentru că ar fi atât de ușor să tastați Control-c din greșeală și-l omoare pe editor.

O: Make asa.

Comentarii (5)

În sintaxa modelului/foo/bar`\r și \n au sensuri diferite, în funcție de context.


pe scurt:

Pentru "foo":
\n = newline (DACA pe linux/mac, CRLF pe windows)
\r = retur de car (CR)

Pentru "bar":
\r = este newline
\n = null byte.

mai mult: (cu numere ascii)

`NUL` = 0x00 = 0 = CTRL@
`DACĂ` = 0x0A = 10 = CTRLJ
`CR` = 0x0D = 13 = CTRLM

Aici este o listă a ASCII caractere de control, introduceți-le în vim prin CTRLvCTRL---key---.
În bash sau alte unix/linux scoici doar de tip CTRL--- - cheie---. Încercați CTRLM în bash, este la fel ca a lovit ENTER, ca shell își dă seama de ceea ce se înțelege, chiar dacă linux utilizarea sistemelor de Feed-uri de Linie pentru linia de delimitare.

Pentru a introduce literal's în bash, anulează-le cu CTRLv va lucra, de asemenea.

Încercați în bash:

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

Acesta utilizează ANSI secvențe escape, introduceți cele două ^['s prin CTRLvESC.

Ai putea încerca, de asemenea,CTRLvCTRLmENTER, care vă va oferi acest lucru:

bash: $'\r': command not found

Amintiți-vă \r de mai sus? :>

Acest ASCII caractere de control lista este diferit de la un complet ASCII simbol masă, în care caracterele de control, care sunt introduse într-o consolă/pseudoterminal/vim prin CTRL cheie (haha), pot fi găsite acolo. Întrucât în C și cele mai multe alte limbi pe care le folosesc, de obicei, octal coduri pentru a reprezenta aceste 'personaje'.

Dacă chiar vrei să știi de unde vin toate astea: http://www.linusakesson.net/programming/tty/.
Acesta este cel mai bun link-ul va veni peste despre acest subiect, dar feriți-vă: Nu fi dragoni.


TL;DR

De obicei, foo = \n, și bar = \r.

Comentarii (4)

Aveți nevoie pentru a utiliza

:%s/,/^M/g

Pentru a obține ^M caracter, apăsați Ctrl v urmat de Enter

Comentarii (1)

\r poate face munca pentru tine.

Comentarii (0)

Cu Vim pe Windows folosesc Ctrl+Q în loc de Ctrl+V

Comentarii (0)

Acest lucru este cel mai bun răspuns pentru modul în care cred, dar ar fi fost frumos într-un tabel: https://stackoverflow.com/a/12389839/962394.

Deci, reformularea:

Ai nevoie de a utiliza \r a utiliza o linie de alimentare (ascii 0x0a, unix newline) într-un regex înlocuirea dar care este specific pentru înlocuirea - în mod normal trebuie să continue să se aștepte să folosi \n pentru linia de alimentare și \r pentru retur.

Acest lucru este pentru că vim folosit \n un înlocuitor la ZERO caracter (ascii 0x00). S-ar putea fi de așteptat NIL a fost \0 în schimb, eliberarea \n pentru utilizarea obișnuită pentru linia de alimentare, dar \0 are deja un sens în regex înlocuiri asa ca a fost mutat de la \n. Prin urmare, apoi merge mai departe pentru a schimba, de asemenea, newline de la \n pentru \r (care într-un regex model este retur de car caracter ascii 0x0d).

caracter | cod ascii | C reprezentare | regex meci | regex înlocuire
-------------------------+------------+------------------+-------------+------------------------
nil | 0x00 | \0 | \0 | \n
linie furaje (unix newline) | 0x0a | \n | \n | \r
retur de car | 0x0d | \r | \r | <necunoscut>

NB: ^M (Ctrl-V Ctrl-M pe linux) inserează o linie nouă, atunci când este utilizat într-un regex de înlocuire, mai degrabă decât un retur de car după cum alții au sfătuit (am încercat).

De asemenea, rețineți că vim va traduce conducta de alimentare caracter atunci când se salvează în fișier bazat pe formatul de fișier de setări și care ar putea produce confuzii.

Comentarii (0)

De la eclipsa din ^M caractere pot fi încorporate într-o linie, și doriți să le converti la liniile noi.

:s/\r/\r/g
Comentarii (0)

Dar dacă unul are pentru a înlocui apoi următorul lucru funcționează

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

în cele de mai sus, fiecare linie este substituită cu următoarea linie și apoi |- și din nou o viitoare linie. Acest lucru este folosit în wiki mese. dacă textul este după cum urmează:

line1
line2
line3

este schimbat la

line1
|-
line2
|-
line3
Comentarii (0)

Dacă aveți nevoie pentru a face pentru un dosar întreg, a fost, de asemenea, mi-a sugerat că ai putea încerca din linia de comandă

sed 's/\\n/\n/g' file > newfile
Comentarii (1)

Iată răspunsul care a lucrat pentru mine. De la tipul asta

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

Altceva trebuie să fac și nu-și pot aminti și apoi trebuie să se uite în sus.

În vi pentru a introduce un caracter linie nouă într-o căutare și înlocuiți, face următoarele:

:%s/look_for/replace_with^M/g comanda de mai sus va înlocui toate instanțele de "look_for" cu "replace_with\n" (cu \n sensul newline)

pentru a obține "^M", introduceți combinația de taste "ctl-V", apoi, după care (eliberați toate cheile) apăsați pe tasta "enter".


Comentarii (0)