Soru Vim'deki bir satırın bir karakteri nasıl değiştirilir?


Her birini değiştirmeye çalışıyorum , Mevcut dosyada yeni bir satır:

:%s/,/\n/g 

Ama neye benzediğini ekler ^@ gerçek bir yeni hat yerine. Dosya DOS modunda veya hiçbir şeyde değil.

Ne yapmalıyım?

Merak ediyorsan benim gibi soruyu kontrol et Vim için neden yeni bir satır var? de.


1591
2017-09-16 11:19


Menşei


Yığın Taşması, programlama ve geliştirme soruları için bir sitedir. Bu soru konu dışı görünmektedir, çünkü programlama veya geliştirme ile ilgili değildir. Görmek Burada hangi konuları sorabilirim? Yardım Merkezi’nde belki Süper Kullanıcı veya Unix ve Linux Yığını Değişimi sormak için daha iyi bir yer olurdu. - jww
Bu soru 10 yaşında ... göç etmek için çok yaşlı görünüyor. Bunun gibi birçok soru var, örneğin: stackoverflow.com/questions/10175812/... - Vinko Vrsalovic


Cevaplar:


kullanım \r yerine \n.

Tarafından değiştiriliyor \n metne boş bir karakter ekler. Yeni bir satır almak için \r. Ne zaman aramak yeni satır için hala kullanıyorsunuz \n, ancak. Bu asimetri, aslında \n ve \r  biraz farklı şeyler yapmak:

\n satır sonu (newline) ile eşleşir \r bir satır başı ile eşleşir. Öte yandan, ikamelerde \n bir boş karakter ekler \r bir satırsonu ekler (daha doğrusu, giriş olarak kabul edilir) <Cr>). 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 ortaya çıkan dosyanın bir hexdump 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.

Diğer bir deyişle, \n bayt 0x00'ü metne ekledi; \r bayt 0x0a ekledi.


2076
2017-09-16 11:21



bu neden bu şekilde çalışıyor? - Vinko Vrsalovic
/ r Enter / Return tuşuna basılarak işlem görür. Tüm platformlarda çalışır. - Luka Marinko
her ne sebeple olursa olsun, '\ n with' yerine \ n, \ n şunu yaparken çalışır:% s / '\ n /', \ r / g - tipu
Ayrıca bakınız Vim için neden yeni bir satır var?. - Andrew Marshall
Keşke bu klasik vi için çalıştı. AIX v6.1'de, \r bu şekilde çalışmıyor. Ama sen basabilirsin Ctrl-V  Enter yazarak yerine \r, ve çalışıyor. - eksortso


İşte hile:

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

:set magic

Sonra yap:

:s/,/,^M/g

Almak için ^M karakter, tür Kontrol-v ve vur Girmek. Windows altında Kontrol-q, Girmek. Bunları hatırlayabileceğim tek yol, ne kadar az anlamlı olduklarını hatırlamaktır:

C: Bir yeni hattı temsil etmek için kullanılacak en kötü kontrol karakteri ne olurdu?

B: ya q (Çünkü genellikle "Çık" anlamına gelir) veya v çünkü yazması çok kolay olurdu Kontrol-c yanlışlıkla ve editörü öldürün.

C: Yap o zaman.


166
2017-09-25 23:40



Windows'da GVim kullanıyorum ve :set magic (~ / _vimrc’imde değil) ctrl-q. Sadece basit ctrl-v ardından giriş oluşturur ^M Benim için karakter sadece iyi. - Chris Phillips
C-v bir yeni satırı temsil etmez; "bir sonraki gerçek karakter" komutudur. C-v'nin ne için bir anımsatıcı olduğunu bilmiyorum, ama zihinsel olarak yeni çizgiyle eşleşmemesinin bir nedeni var. - Jim Stewart
Ctrl-v, "verbatim" için bir anımsatıcıdır - yani, "verbatim" anahtar koduna / karakterine bir sonraki tuşa basmaktan kaçınır. Windows'da yapıştırın: şeyleri tanıdık tutmak için. Ctrl-Q, "(un) Alıntı" içindir. Oldukça aptalca - ama ikili dosyalarda kullanabilirsiniz - ör. Ctrl-A'yı Ctrl-Z (Ascii 1-26 sanırım) ile aramak için. - Tomasz Gandor
Şimdi ekstra olanı kaldırmak zorundayım "," bu komut tanıtıldı ... - Danny Wang
Ctrl-C Normal modda sizi iptal etmesine rağmen editörü gerçekten öldürmez. Ctrl-Vverbatim anlamına gelir, ve Ctrl-Q birisinin yükleme hatasını yaptığı anlamına gelir $VIMRUNTIME/mswin.vim yapılandırma dosyası. Mswin'e ihtiyacın yok. Bunun yerine kendi vimrc'ini kullan. - 00dani


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


İçin foo:
\ n = yeni satır
\ r = CR (satır başı = Ctrl-M = ^ M)

İçin bar:
\ r = yeni satır
\ n = boş bayt (0x00).


Geçmişte sık sık bu tür şeyler hakkında sorular gördüm, ve bazen gelecekte neredeyse hiç kimse bu şeyler hakkında bir şey bilmeyecek ...

'Popüler' isteğine göre:

İşte bir listesi ASCII kontrol karakterleri, içine yerleştirin vim üzerinden CTRLvCTRL--- anahtar ---.
İçinde bash veya diğer unix / linux kabukları sadece yazın CTRL--- anahtar ---. Deneyin CTRLM bash, isabetle aynı GİRMEKlinux sistemleri hat sınırlama için Satır Beslemeleri kullansalar bile, kabuk ne anlama geldiğini anladığından. Line Feed için sadece kontrol karakteridir CTRL-Abash 'satırın başlangıcına atlamak' için bağlı olan.

Edebiyatı bash içine sokmak için CTRLv ayrıca çalışacak.

Bash'da dene:

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

Bu kullanır ANSI çıkış dizileriiki tane ekle ^[üzerinden CTRLvESC.

Ayrıca deneyebilirsiniz CTRLvCTRLmGİRMEK, size bunu verecek:

bash: $'\r': command not found

Hatırla \r yukardan? :>

ASCII kontrol karakterleri liste standarttan farklı ascii sembol tablosu, bir konsol / psödoterminal / vim içine sokulan kontrol karakterleri aracılığıyla CTRL anahtar (haha), orada bulunabilir. Oysa C ve diğer birçok dilde, genellikle bu 'karakterleri' temsil etmek için sekizlik kodları kullanırsınız.

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


TL; DR

Genellikle foo = \n, ve bar = \r.


65
2017-09-23 14:00



Bu yüzden bir karakteri bir vagon dönüşüyle ​​nasıl değiştireceğinizi merak ediyorum - codeshot
@codeshot :s/x/^M/g yapmak gerekir. Takın ^M üzerinden ctrl-v bunu takiben ctrl-m. - sjas
Teşekkürler sjas, bu sorunun tüm zamanların en tuhaflarından biri olduğunu biliyorsunuz. Temel olarak "vim, ne bulduğunuzu yapar." Diye bir şey söyleyen cevap için 1008 oy. Bunun nedeni, vim'in bulduğunuz şeyi yapmasıdır. Desendeki ilginç karakterler için kısa bir kod listesi, tuhaflığın yerini ve nedenini bulmayı umuyordum, böylece diğer benzer tuhaflıkları hatırlamak ve tahmin etmek kolay. Bu benim oy hakkımı alacaktı. - codeshot
@codeshot ascii kontrol karakterlerinin bir listesi size yardımcı olabilir. Görmek cs.tut.fi/~jkorpela/chars/c0.html daha fazla referans için. Cevabımı iki bağlantı içerecek şekilde güncelleyeceğim. - sjas
@codeshot İlginç bulabileceğiniz şeyler ile yazıyı tekrar güncelledim. HARD'ın tutarlı bir yazışmada google üzerinden bu bilgileri bulması nedeniyle, sanırım bu konularda bir blog yayıncısı gecikmiş ... - sjas


Kullanmalısın

:%s/,/^M/g

Almak için ^M karakter, basın Ctrl  v bunu takiben Girmek


45
2017-09-16 11:30



^ M karakterini almak için <C-v> <C-m> yapmalıyım. - Jezen Thomas


\r işini senin için yapabilirsin.


27
2017-09-16 11:21





Windows'taki Vim ile Ctrl+S yerine Ctrl+V


20
2017-09-16 11:45





Tutulmadan ^M karakterler bir satıra gömülebilir ve bunları satırsonlarına dönüştürmek istersiniz.

:s/\r/\r/g

8
2017-09-06 17:53