Mai mult
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.
1859
11
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.Cu alte cuvinte,
\n
a introdus octet 0x00 în text;\r
a introdus octet 0x0a.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.
Apoi, face:
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:Î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:
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:
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
, șibar
=\r
.Aveți nevoie pentru a utiliza
Pentru a obține
^M
caracter, apăsați Ctrl v urmat de Enter\r
poate face munca pentru tine.Cu Vim pe Windows folosesc Ctrl+Q în loc de Ctrl+V
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 (ascii0x0a
, 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 (ascii0x00
). 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 ascii0x0d
).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.
De la eclipsa din
^M
caractere pot fi încorporate într-o linie, și doriți să le converti la liniile noi.Dar dacă unul are pentru a înlocui apoi următorul lucru funcționează
î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ă:
este schimbat la
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ă
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".