it-swarm-tr.com

Vim'de bir karakterin yeni satır ile nasıl değiştirileceği

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

:%s/,/\n/g 

Ancak, gerçek bir yeni satır yerine ^@ gibi göründüğünü ekler. Dosya DOS modunda veya herhangi bir şey değil.

Ne yapmalıyım?

Merak ediyorsanız, benim gibi,sorusunu kontrol edin. Neden Vim için yeni bir hat var?aynı zamanda.

1755
Vinko Vrsalovic

\r yerine \n kullanın.

\n ile değiştirme, metne boş bir karakter ekler. Yeni bir satır almak için \r öğesini kullanın. Bununla birlikte yeni bir satır ararken , yine de \n öğesini kullanırsınız. Bu asimetri, \n ve \rbiraz farklı şeyler yapar :

\n bir satırın sonu (newline) ile eşleşir, \r ise satır başı ile eşleşir. Öte yandan, \n değişkenlerinde boş karakter eklerken \r yeni bir satır ekler (daha doğrusu girdi olarak kabul edilir). <CR>). İşte bunu göstermek için Vim komut satırı özelliğini kullanarak küçük, etkileşimli olmayan bir örnek. (Başka bir deyişle, aşağıdakileri kopyalamak ve çalıştırmak için bir terminale yapıştırabilirsiniz). xxd, elde edilen dosyanın bir hexdump'ı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, \n, bayt 0x00'u metne yerleştirmiştir; \r, bayt 0x0a'yı ekledi.

2317
Konrad Rudolph

İşte püf noktası:

Öncelikle, vi (m) oturumunuzu özel karakterlerle (yani: newline) desen eşleşmesine izin verecek şekilde ayarlayın. Muhtemelen bu satırı .vimrc veya .exrc dosyanıza koymaya değer.

:set magic

Ardından, yapın:

:s/,/,^M/g

^M karakterini almak için, Control-v ve vur Enter. Windows altında Control-qEnter. Bunları hatırlayabilmemin tek yolu, ne kadar az anlamlı olduklarını hatırlamaktır:

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

B: Ya q (çünkü genellikle "Çık" anlamına gelir) ya da v, yazmak çok kolay olurdu çünkü Control-c yanlışlıkla ve editörü öldür.

A: Öyle yap.

184
Logan

Sözdiziminde s/foo/bar\r ve \n, bağlama bağlı olarak farklı anlamlara gelir.


kısa:

fooiçin:
\n = yeni satır (linux/mac'te LF, pencerelerde CRLF)
\r = satır başı (CR)

bariçin:
\r = yeni satır
\n = boş bayt.

daha uzun: (ascii numaraları ile)

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

ASCII kontrol karakterlerinin listesi, onları vimaracılığıyla CTRLvCTRL---key---.
bashya da diğer unix/linux kabukları sadece şunu yazın CTRL---key---. Deneyin CTRLM bash, vurmakla aynı ENTERShell'in ne anlama geldiğini anladığı gibi linux sistemleri satır sınırlaması için Line Feeds kullanıyor olsa da.

Değişmezleri bash olarak eklemek için CTRLv ayrıca çalışacak.

Bash deneyin:

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

Bu kullanır ANSI kaçış dizileri , iki ^[ 's üzerinden ekleyin CTRLvESC.

Ayrıca deneyebilirsiniz CTRLvCTRLmENTER, size bunu verecek:

bash: $'\r': command not found

\r öğesini yukarıdan hatırladın mı? :>

Bu ASCII kontrol karakterleri listesi, bir konsola yerleştirilen kontrol karakterlerinden, ASCII sembol tablosundan farklıdır./pseudoterminal/vim ile CTRL anahtar (haha), orada bulunabilir. Oysa C ve diğer birçok dilde, bu 'karakterleri' temsil etmek için genellikle sekizlik kodları kullanırsınız.

Tüm bunların nereden geldiğini gerçekten bilmek istiyorsanız: http://www.linusakesson.net/programming/tty/ .
Bu, bu konuyla ilgili karşılaşacağınız en iyi bağlantı, ancak dikkat: Ejderhalar var.


TL; DR

Genellikle foo= \n ve bar= \r.

84
sjas

Kullanman gerek

:%s/,/^M/g

^M karakterini elde etmek için Ctrlv bunu takiben Enter

50
dogbane

\r burada işi sizin için yapabilir.

33
Lasar

Windows kullanımında Vim ile Ctrl+Q yerine Ctrl+V

22
grantc

Bu düşündüğüm yol için en iyi cevap, ancak bir tabloda daha iyi olurdu: https://stackoverflow.com/a/12389839/962394 .

Öyleyse, yeniden değerlendirme:

Bir regex değişiminde bir satır beslemesi (ascii \r, unix newline) kullanmak için 0x0a kullanmanız gerekir, ancak bu değiştirme işlemine özgüdür - normalde satır besleme için \n ve satırbaşı için \r kullanmayı beklemelisiniz.

Bunun nedeni, vim'in NIL karakterini (ascii \n) değiştirmek için 0x00 yerine kullanmasıdır. NIL'nin yerine \0 olmasını beklemiş olabilirsiniz, satır besleme için olağan kullanımı için \n öğesini serbest bırakma olabilir, ancak \0 zaten regex değiştirmelerinde bir anlam ifade eder, bu nedenle \n öğesine kaydırılmıştır. Bu nedenle, daha sonra yeni satırı da \n'dan \r'a kaydırın (regex düzeninde satır başı karakteri, ascii 0x0d).

 karakter | ascii kodu | C gösterimi | regex maçı | regex değiştirme 
 ------------------------------ +---------- + ---- -------------- + ------------- + --------------------- --- 
 nil | 0x00 |\0 |\0 |\n 
 satır besleme (unix newline) | 0x0a |\n |\n | 
 satır başı | 0x0d | | | <Bilinmeyen> 

Not: ^M (linux'taki Ctrl-V Ctrl-M), başkalarının tavsiye ettiği şekilde bir satır başı yerine regex yerine kullanıldığında yeni bir satır ekler (daha önce denedim).

Ayrıca, vim'in dosya formatı ayarlarına bağlı olarak dosyaya kaydederken satır beslemesi karakterini çevireceğini ve bu durumun kafasını karıştırabileceğini unutmayın.

10
codeshot

Eclipse'den, ^M karakterleri bir satıra yerleştirilebilir ve bunları yeni satırlara dönüştürmek istersiniz.

:s/\r/\r/g
10
rickfoosusa

Fakat eğer birinin yerini değiştirmek zorunda kalırsa, o zaman aşağıdaki işler işe yarayacak

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

yukarıdakilerde her sonraki satır sonraki satırla değiştirilir ve sonra | - ve bir sonraki satırla 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

Eğer bütün bir dosya için yapmanız gerekiyorsa, bana komut satırından deneyebileceğiniz de önerildi.

sed 's/\\n/\n/g' file > newfile
6
Evan Donovan

Benim için işe yarayan heres. Bu adamdan

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


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

Vi'da 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 “change_with\n” ile değiştirir (\ n newline anlamına gelir)

“^ M” harfini almak için, “ctl-V” tuş kombinasyonunu girin, ardından bundan sonra (tüm tuşları bırakın) “enter” tuşuna basın.


4
user407749