Vim'de bir karakteri yeni satırla değiştirme


1967

,Geçerli dosyadaki her birini yeni bir satırla değiştirmeye çalışıyorum :

:%s/,/\n/g 

Ancak ^@gerçek bir satırsonu yerine neye benzediğini ekler . Dosya DOS modunda değil.

Ne yapmalıyım?

Eğer benim gibi merak ediyorsanız, neden Vim için yeni satır? Sorusunu kontrol edin. de.


2
Stack Overflow, programlama ve geliştirme soruları için bir sitedir. Bu soru konu dışı gibi görünüyor çünkü programlama veya geliştirme ile ilgili değil. Yardım Merkezi'nde hangi konular hakkında soru sorabilirim konusuna bakın . Belki Süper Kullanıcı veya Unix & Linux Stack Exchange sormak için daha iyi bir yer olurdu.
jww

5
@jww bu soru 10 yaşında ... taşınmak için çok eski gibi görünüyor. Bunun gibi birçok soru var, örneğin: stackoverflow.com/questions/10175812/…
Vinko Vrsalovic

14
@jww vim, programcılar için yaygın olarak kullanılan bir araçtır ve programcılar için yaygın olarak kullanılan araçlarla ilgili sorular Yığın Taşması konusudur . Açıkçası bu Vi ve Vim için daha uygundur .
user202729

Yanıtlar:


2565

Yerine \rkullanın \n.

Yedekleme \nmetne boş bir karakter ekler. Yeni satır almak için tuşunu kullanın \r. Yeni bir satır ararken , yine de kullanabilirsiniz \n. Bu asimetri nedeniyle gerçeğine olduğunu \nve \r biraz farklı şeyler yapmak :

\nsatır sonu (satırsonu) ile eşleşirken satır \rbaşı ile eşleşir. Öte yandan, ikamelerde \nboş karakter \reklerken, yeni satır ekler (daha kesin olarak girdi olarak kabul edilir <CR>). İşte Vim komut satırı özelliğini kullanarak bunu göstermek için etkileşimli olmayan küçük bir örnek (başka bir deyişle, aşağıdakini kopyalayıp çalıştırmak için bir terminale yapıştırabilirsiniz). xxdortaya çıkan dosyanın onaltılık dökümünü gösterir.

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.

Başka bir deyişle, \n0x00 baytını metne ekledi; \r0x0a baytını ekledi.


127
/ r Enter / Return tuşuna basma olarak kabul edilir. Tüm platformlarda çalışır.
Luka Marinko


14
Keşke bu klasik vi için çalışsaydı. AIX v6.1'de \rböyle çalışmaz. Ancak Ctrl-V Enteryazmak yerine basabilirsiniz \rve işe yarıyor.
eksortso

3
Partiye geç kaldım. Eğer \rekler <CR>ve \nekler bir null, nasıl bir satır başı ile değiştirebilsennasıl ki?
Bay Llama

2
@SunnyRaj CR ve LF'nin geçmişinden emin misiniz? Başlangıçta LF'nin kağıdı bir satır ileri taşıdığı, ancak baskı kafasını hareket ettirmediği ve CR'nin baskı kafasını hareket ettirdiği ancak kağıdı hareket ettirmediği izlenimindeydim. Sonuç olarak, işletim sisteminiz yazdırmadan önce girişi dönüştürmediyse, doğru çıktıyı elde etmek için sadece LF veya CR kullanamazsınız. MS DOS, metin dosyası formatı olarak ham yazıcı verilerini, Mac OS CR'yi kullandı ve bundan yazıcının ham biçimine, UNIX ise LF'yi kullandı ve bundan yazıcının ham biçimine dönüştürdü.
Mikko Rantalainen

210

İşte hile:

İlk olarak, Vi (m) oturumunuzu özel karakterlerle desen eşleşmesine izin verecek şekilde ayarlayın (örn: yeni satır). Muhtemelen bu satırı .vimrc veya .exrc dosyanıza koymaya değer:

:set magic

Sonra yapın:

:s/,/,^M/g

^MKarakteri almak için Ctrl+ yazın Vve tuşuna basın Enter. Windows altında Ctrl+ Q, yapın Enter. Bunları hatırlamanın tek yolu ne kadar az anlam ifade ettiklerini hatırlamaktır:

C: Yeni bir satırı temsil etmek için kullanılacak en kötü kontrol karakteri ne olurdu?

B: Ya q(genellikle "Quit" anlamına gelir) ya da + işaretini yanlışlıkla yazmak ve editörü öldürmek vçok kolay olacağından .CtrlC

C: Öyle olsun.


9
Windows'ta GVim kullanıyorum ve ne gerek :set magic(benim ~ / _vimrc'de değil) veya ctrl-q. Sadece basit bir ctrl-venter ve ardından ^Mbenim için karakter iyi yaratır .
Chris Phillips

5
CV yeni bir satırı temsil etmez; "bir sonraki değişmez karakterden kaç" komutudur. Cv'nin ne için bir anımsatıcı olduğunu bilmiyorum, ancak zihinsel olarak yeni satıra eşlememesinin bir nedeni var.
Jim Stewart

27
Ctrl-v "verbatim" için bir anımsatıcıdır - yani "verbatim" anahtar koduna / karakterine basılan bir sonraki tuşa kaçar. Windows'ta macun: şeyleri tanıdık tutmak. Ctrl-Q belki "(un) Alıntı" içindir. Her neyse, aptalca - ama ikili dosyalarda kullanabilirsiniz - örneğin Ctrl-A ile Ctrl-Z (Ascii 1-26 Sanırım).
Tomasz Gandor

1
Ctrl-Cdüzenleyiciyi gerçekten öldürmez, ancak sizi Normal moda geri döndürebilir. Ctrl-Vkelimesi kelimesine Ctrl-Qanlamına gelir ve birisinin $VIMRUNTIME/mswin.vimyapılandırma dosyasını yüklerken hata yaptığı anlamına gelir . Mswin'e ihtiyacınız yok. Bunun yerine kendi vimrc'nizi kullanın.
00dani

Vay canına, bu harika. sed -n l Şimdiye kadar yapardım . Aynı şeyin Ctrl-vvim ile elde edilebileceğini bilmek güzel .
arpit

98

Sözdiziminde s/foo/bar, \rve \nbağlama göre, farklı anlamlara sahip.


Kısa:

Şunun için foo:

\ n = satırsonu (Linux / Mac üzerinde LF, Windows'ta CR + LF)
\ r = satır başı (CR)

Şunun için bar:

\ r = satırsonu
\ n = boş bayt.

Daha uzun (ASCII numaraları ile):

NUL= 0x00 = 0 = Ctrl+ @
LF= 0x0A = 10 = Ctrl+ J
CR= 0x0D = 13 = Ctrl+M

ASCII kontrol karakterlerinin listesi . Bunları Ctrl+ V, Ctrl+ ile Vim'e ekleyin ---key---.

Bash veya diğer Unix / Linux kabuklarına Ctrl+ yazın ---key---.

Bash'te Ctrl+ M'yı deneyin . EnterLinux sistemleri hat sınırlaması için satır beslemeleri kullansa da, kabuğun ne anlama geldiğini fark ettiği için vurmakla aynı şey.

Değişmez değerleri bash'a eklemek için, Ctrl+ işaretiyle birlikte eklemek Vde işe yarayacaktır.

Bash'te deneyin:

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

Bu, ANSI kaçış dizilerini kullanır . İkisini + , ^[ile ekleyin .CtrlVEsc

Ayrıca , + , Ctrl+ V, ' Ctrlyı deneyebilirsiniz ;MEnter

bash: $'\r': command not found

\rYukarıdakileri hatırlıyor musunuz? :>

Bu ASCII kontrol karakterleri listesi, eksiksiz bir ASCII sembol tablosundan farklıdır , burada Ctrl(haha) tuşu ile bir konsola / psödoterminal / Vim'e eklenen kontrol karakterleri bulunabilir.

C ve diğer birçok dilde ise, genellikle bu 'karakterleri' temsil etmek için sekizli kodları kullanırsınız.

Tüm bunların nereden geldiğini gerçekten bilmek istiyorsan: TTY tiksindirdi . Bu konu hakkında karşılaşacağınız en iyi bağlantı bu, ancak dikkat: Ejderhalar var.


TL; DR

Genellikle foo= \nve bar= \r.


1
Bu yüzden bir karakteri bir satır başı ile nasıl değiştireceğinizi merak ediyorum
codeshot

2
@ codeshot :s/x/^M/gyapmalı. Yerleştirin ^Maracılığıyla ctrl-vizledi ctrl-m.
sjas

3
Teşekkürler sjas, bu sorunun tüm zamanların en tuhaflarından biri olduğunu biliyorsun. 1008 oy, temelde "vim bulduğunuz şeyi yapıyor. Vim bulduğunuz şeyi yapıyor. Vim'in bulduklarınızı yaptığını asla unutmayın." Desendeki ilginç karakterler için kodların kısa bir listesini, tuhaflığın yerini ve nedenini bulmayı umuyordum, bu yüzden hatırlamak ve diğer benzer garipliği tahmin etmek kolay. Bu benim oyumu alacaktı.
codeshot

@codeshot size ascii kontrol karakterlerinin bir listesi yardımcı olabilir. Daha fazla referans için cs.tut.fi/~jkorpela/chars/c0.html adresine bakın . Cevabımı iki bağlantı içerecek şekilde güncelleyeceğim.
sjas

55

Kullanmanız gerekenler:

:%s/,/^M/g

^MKarakteri almak için önce Ctrl+ vardından tuşuna basın Enter.


4
^ M karakterini almak için <Cv> <Cm> yapmalıyım.
Jezen Thomas


24

Windows üzerinde Vim ile Ctrl+ Qyerine Ctrl+ kullanın V.


16

Bu düşündüğüm yol için en iyi cevap, ama bir tabloda daha güzel olurdu:

Neden Vim için yeni satır?

Yani, yeniden yazma:

Normal regex değişiminde \rbir satır besleme (ASCII 0x0A, Unix newline) kullanmak için kullanmanız gerekir , ancak bu değiştirmeye özgüdür - normalde \nsatır besleme ve \rsatır başı için kullanmayı beklemeye devam etmelisiniz .

Bunun nedeni, Vim'in \nNIL karakterini (ASCII 0x00) ifade etmek için kullanılmasıdır . Bunun \0yerine, NIL'in \nsatır besleme için olağan kullanımını serbest bırakmasını beklemiş olabilirsiniz , ancak \0normal ifade değiştirmelerinde zaten bir anlamı vardır, bu yüzden değiştirilmiştir \n. Bu nedenle daha sonra da gelen yeni satır kayması daha fazla olacak \nkadar \r(ki bir normal ifade desen satır dönüş karakteri, ASCII 0x0D).

Karakter | ASCII kodu | C gösterimi | Regex maçı | Normal ifade değiştirme
------------------------- + ------------ + ----------- ------- + ------------- + ------------------------
nil | 0x00 | \ 0 | \ 0 | \ n
satır besleme (Unix satırsonu) | 0x0a | \ n | \ n | \ r
taşıma iadesi | 0x0d | \ r | \ r | <Bilinmeyen>

Not: ^M( Linux'ta Ctrl+ V Ctrl+ M), başkalarının önerdiği gibi bir satır başı yerine normal ifade yerine kullanıldığında yeni satır ekler (sadece denedim).

Ayrıca Vim'in dosya biçimi ayarlarına göre dosyaya kaydedildiğinde satır besleme karakterini çevireceğini ve bu durumun kafasını karıştırabileceğini unutmayın.


11

Gönderen Eclipse , ^Mkarakterler bir çizgi gömülü ve satırsonlarına onları dönüştürmek istediğiniz edilebilir.

:s/\r/\r/g

8

Ancak eğer birinin değiştirilmesi gerekiyorsa, aşağıdaki şey işe yarar:

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

Yukarıda, sonraki her satır bir sonraki satır ve sonra |-tekrar yeni bir satır ile değiştirilir. Bu wiki tablolarında kullanılır.

Metin aşağıdaki gibi ise:

line1
line2
line3

Olarak değiştirildi

line1
|-
line2
|-
line3

7

Bir dosya için yapmanız gerekiyorsa, komut satırından da deneyebileceğiniz bana önerildi:

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

1
Bunun GNU sed gerektirdiğini unutmayın. printf 'foo\\nbar\n' | sed 's/\\n/\n/g'Sisteminizde çalışıp çalışmayacağını görmeye çalışın . (Bu öneri için freenode üzerinde #bash'in iyi insanlarına kredi verin.)
Evan Donovan

Evet, ama soru Vim hakkındaydı. Yığın Taşması sorusu var Bir satırsonunu (\ n) sed kullanarak nasıl değiştirebilirim? .
Peter Mortensen

5

İşte benim için işe yarayan cevap. Bu adamdan:

---- alıntılama yerine bir satırsonu karakter eklemek için vi düzenleyicisini kullanın


Yapmam gereken ve hatırlayamadığım ve daha sonra aramak zorunda olduğum başka bir şey.

Vi'de, bir aramaya yeni satır karakteri eklemek ve değiştirmek için aşağıdakileri yapın:

:%s/look_for/replace_with^M/g

Yukarıdaki komut tüm “look_for” örneklerini “replace_with \ n” ile değiştirir (\ n yeni satır anlamına gelir).

“^ M” yi almak için Ctrl+ tuş kombinasyonunu girin Vve ardından (tüm tuşları serbest bırakın) tuşuna basın Enter.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.