Vim'de açılan bir dosyada ^ M linebreak'i 'normal' linebreak'e nasıl dönüştürebilirim?


481

^ M ile biten her satırda vim gösterileri

Bunu 'normal' linebreak ile nasıl değiştirebilirim?



3
Lütfen çözümü dosya biçimi değişikliği olarak değiştirin, çünkü bu en temiz çözümdür.
erikbwork

1
Bu sorunun vim ile ilgili olduğunu biliyorum, ancak diğer bazı Google aramaları da bu konuya giriyor. Bu nedenle, sisteminizde Eclipse yüklüyse, tek bir dosya veya birkaç tıklamayla tam bir klasör ağacı için satır sınırlayıcıyı dönüştürebilirsiniz: stackoverflow.com/a/7019737/1364747
Teddy

Normal satır sonlarını "normal" olarak adlandırmayı seviyorum - bu ^ M satır sonlarının aksine :-)
DerMike

Yanıtlar:



577

komuta

:%s/<Ctrl-V><Ctrl-M>/\r/g

Burada <Ctrl-V><Ctrl-M>aracı tipi Ctrl+ Vo Ctrl+ M.

açıklama

:%s

yedek,% = tüm satırlar

<Ctrl-V><Ctrl-M>

^ M karakterleri (Ctrl-V, Ctrl ^ karakterini yazmanın Vim yoludur ve Ctrl-M, M ifadesini normal ifadeden sonra yazar ve ^ M özel karakterine neden olur)

/\r/

yeni satırla ( \r)

g

Ve küresel olarak yapın (sadece hattaki ilk olay değil).


21
^ M karakterlerini kaldırdı ancak satır başı eklemiyor.
luckytaxi

14
@jumpnett - Ctrl-V / Ctrl-M anahtar akorlarını itmeniz gerekir, kelimesi kelimesine metin olarak girmeyin.
LeopardSkinPillBoxHat

33
Bu kesinlikle soru için doğru cevaptır, eğer bir ^ M ve ardından yeni bir satırınız varsa, yeni satırı tutmak, ancak ^ M'yi kaldırmak istersiniz. Diğer ikame işlemini aşağıda yapmak, dosyanızı çift boşluklu yapar.
dlamblin

12
Hâlâ bir satır başı eksikse (örneğin, ^ M kaldırılmış ancak her şey tek bir satıra sarılmışsa) şunu yapın: :%s/<Ctrl-V><Ctrl-M>/\r/g(burada ^ M, yeni satırla değiştirilir).
William Turrell

7
Windows'ta Vim kullanıyorsanız, <Ctrl-V> yerine <Ctrl-Q> kullanmanız gerekir.
GrandAdmiral

418

Linux ve Mac OS'de aşağıdakiler çalışır,

:%s/^V^M/^V^M/g

burada + ^V^Mtürü , ardından +CtrlVCtrlM .

Not: Windows'da muhtemelen ^Qyerine kullanmak istersiniz ^V, çünkü varsayılan ^Volarak metin yapıştırmak için eşlenir.


3
Bu neden bir düşüş yaptı? Dosyanız bir satır üzerine ezildiğinde bile yanlış satır sonu olduğu için çalışır.
Paul Tomblin

2
Hayır. Yolum dosyadaki satır sonu olanı doğru satır sonu ile değiştirir.
Paul Tomblin

7
Dosyanızda yeni satırlar YOK, bu daha yaygın olduğunu kabul edeceğim farklı bir sorun içindir. FYI ^ M \ r
dlamblin

12
Bu çok gizemli bir komut, ama benim için bir mac üzerinde çalışıyor.
Eric Walker

5
%s/\r/\r/gSadece ^Msatır sonunda (MacVim açısından bir uzun çizgi) gösteren bir dosya için eşdeğer MacVim üzerinde iyi çalıştı bulundu . Açıkça bu komutun yedek parçaları vs desen farklı şeyler anlamına gelir.
RichVel

184

İçinde vim, dosya biçimine bakın - DOS veya Unix:

:set filetype=unix

:set fileformat=unix

Dosya, satır başı (CR, ^ M) karakterleri olmadan geri yazılır.


3
use: set fileformat = unix Çoğu yapılandırmada filetype yalnızca kullanılan sözdizimi türünü değiştirir.
derGral

6
Bu, sahip olduğum hatayı düzeltti ... Vim, UNIX biçimli dosyamın pencereler olduğunu ve yeni değiştirilen satırların git farkında ^ M olduğunu düşünmeye başladı.
Thomas Hunter II

Sisteme bağlı olmalıdır. Bugün bu işe yaradı. Set komutu vim, btw içinde yapılır.
gbarry

1
harika! çünkü dosya biçimi dos olduğundan, unix olarak ayarlayın ve sorun değil
zhaozhi

3
Bu aynı zamanda BTW vi üzerinde çalışır ve yapabileceğiniz set ff=unixaynı şekilde biraz kısayol olarak ftbir kısayol içindirfiletype
Posva

110

MacVim'de görülen BBEdit ile oluşturduğum bir dosya ^M, normal olanlar yerine bir grup satır döndürme görüntülüyordu . Aşağıdaki dize değiştirme sorunu çözdü - umarım bu yardımcı olur:

:%s/\r/\r/g

İlginç çünkü satır sonlarını aynı karakterle değiştiriyorum, ancak Vim'in doğru bir şekilde görüntülenmesi için yeni bir \ r alması gerektiğini düşünüyorum. Bunun neden işe yaradığının altında yatan mekaniği bilmek isterim.


1
Arama işlevlerinin satır sonu dizilerini tanımaya yönelik daha geniş kuralları kabul etme eğilimi vardır. Ancak veri olarak yazılırken özel bir anlamı vardır.
gbarry

Bu benim için satır sonu olmayan bir dosyayı sıralamak için Windows gVim'de benim için çalıştı, bunun yerine sadece ^ M yerine.
Flash

2
Bu sayfada sunulan tüm çözümlerden, bir csv dosyasından ^ M kaldırılmasında benim için çalışan tek model buydu. MacVim kullanma.
B6431

+1 Mobaterm kullanarak Windows'tan SSHing Ubuntu Trusty'ye çalışırken benim için çalıştı
Carl

Yani, bu, yerine geçmesini belirtmesine rağmen , tüm \rkarakterlerin yerine geçiyor gibiydi . Şikayet değil, tam olarak istediğim buydu. Sadece garip. \n\r
donut

34

İlk olarak, :set ff?dosyanızın dosya biçimini bulmak için kullanın .

Sanırım olabilir unix, o zaman sorun fileformat=dossatır sonuna "^ M ^ J" ekleyerek oluşturuldu ama flieformat=unix"^ M" orada bırakarak, sadece satır sonunda "^ J" kaldırarak okuyun .

Sadece giriş :e ++ff=dosVim komut satırında dos unix adresinin dosyanın biçimini değiştirmek için. Sorunu çözmeli. Değilse, :%s/\r//gsize yardımcı olmalıdır.


3
İkisini de yapmak zorundaydım. :e ++ff=dossonra :set ff=unixve:w
Max

29

^ M karakteri eşleştirmek için görsel olarak seçmek ve daha sonra almak için panoya OS kopyala komutunu kullanmak zorunda kaldı. Replace komutunu denemeden önce karakteri arayarak test edebilirsiniz.

/^M

ilk bozuk satırı seçmeli

:%s/^M/\r/g

tüm hatalı ^ M, satır başı ile değiştirilir.

Bu, gvim 7'ye dayanan MacVim'deki işlevler gibidir.

DÜZENLE:

Windows için Ubuntu olan Windows 10 makinemde tekrar bu sorunu yaşıyorum ve bunun vim için dosya biçimi sorunlarına neden olduğunu düşünüyorum. Bu durumda ff'yi unix, mac veya dos olarak değiştirmek, ^ M'yi ^ J olarak değiştirmek ve tekrar geri dönmek dışında bir şey yapmaz.

Bu durumda çözüm:

:%s/\r$/ /g
:%s/ $//g

Bu rotaya gitmemin sebebi, dosyamda yıkıcı olmadığımdan emin olmak istedim. Ben olabilirdi :%s/\r$//gama bu hemen satır taşıma silerdi ve beklenmedik sonuçlara sahip olabilirdi. Bunun yerine, tekil CR karakterini, burada bir ^ M karakterini bir boşluğa dönüştürüyoruz ve ardından satırların sonundaki tüm boşlukları kaldırıyoruz (bu benim için istenen bir sonuçtur)

Uzun süredir cevaplanan eski bir soruyu canlandırdığım için özür dilerim, ama bazı karışıklıklar var gibi görünüyordu ve bu google aramalarında yüksek çıktığı için bunların bir kısmını temizlemeye yardımcı olacağımı düşündüm.


1
ctrl-v tuşuna basarak ctrl-m karakteri eklemek için de işe yarayabilir fwiw. Ancak \ r uygun satır başı ekler.
Metagrapher

1
Bu doğru cevap. Yukarıda belirtildiği gibi, komuta ^ M harfini eklemek için <ctrl-v> <ctrl-m> tuşlarını kullanın.
carlosayam

1
Katılıyorum, ancak orijinal gönderi sırasında benim için çalışsaydı, o zaman gönderemezdim. ;)
Metagrapher

22

Bunların hiçbiri benim için çalışmadı, bu yüzden denedim, işe yarayan:

tip :%s/

basın CTRL-VCTRL-M

tip //g

basın Enter

Yani Vim'deki genel komut şuna benziyor :%s/^M//g

Bu ne yapar: :%s(bul ve değiştir) /^M/(bu sembol) /(karakter içermez) g(global olarak).


Hadi ama !! Mac üzerinde çalışır.
17'de shamail'de


15

Ctrl kullanmaya gerek kalmadan: :%s/\r$//


1
Ben de öyle yapıyorum. Komutu asla hatırlamıyorum
pixel 67

Bu sonları kaldırmak için önerilen yöntem budur.
Metagrapher


12

Bunu sed ile yaptım:

sed -i -e 's/\r/\n/g' filename


Bunun işe yaradığından emin misin? OSX'de: sed -e 's/\r/\n/g' <<< 'over and over'->oven and oven
Armand

Evet işe yarıyor (çok kullanıyorum), ancak sed'in GNU sürümüne sahip değilseniz OSX'te çalışmayabilir. Apple'ın varsayılan olarak gönderdiği sed sürümü (ne yazık ki) tüm Linux dağıtımlarında bulunan GNU sürümünden çok farklıdır. Daha fazla yardım için bu sorunun cevabına göz atın: stackoverflow.com/q/30003570/2062384
Freedom_Ben

Teşekkürler @Freedom_Ben. Yani bu GNU için çalışıyor gibi görünüyor sedama BSD için değil sed(OSX'te olduğu gibi). Hat kırıklarını düzelten herkes muhtemelen işletim sistemlerinin bir karışımı ile çalışıyor, bu nedenle cevabın ne zaman çalışacağı konusunda net olmak yararlıdır.
Armand

10

Peki ya: :%s/\r//g Bu tamamen benim için çalıştı.

Bunun yaptığı, tüm satırların satır sonunu temizlemek, ^ M'yi kaldırıyor ve hepsi bu.


9

Bu sorunun başka birçok yanıtı var, ancak bir komut satırı çözümüne ihtiyaç duyduğum için, aşağıdakiler benim için en iyisi:

vim -u NONE -c 'e ++ff=dos' -c 'w ++ff=unix' -c q myfile

Açıklama:

  • Herhangi bir .vimrc dosyasını yüklemeden açın myfile
  • Çalıştırmak :e ++ff=dosDos satırı sonları olarak tüm dosyanın yeniden yüklenmesini zorlamak için .
  • :w ++ff=unixUnix satır sonlarını kullanarak dosyayı yazmak için çalıştırın
  • Vim'den çık

3
teşekkür ederim! Bu sorunumu düzeltti ve komut dosyalarında kullanmak yararlı buldu
Peddipaga

8

Ctrl+ Mpenceremi en aza indirir, ancak Ctrl+ Enteraslında bir ^Mkarakter ekler . Ayrıca kaldırmak için emin olmak zorunda kaldıCtrl presler arasında anahtarı dikkat etmeliydim.

Benim için çözüm şuydu:

:%s/<Ctrl-V><Ctrl-Enter>/\r/g

Nerede <Ctrl-V><Ctrl-Enter>için araçlar uzun süreli basın Ctrl , basın ve bırakın V, basın ve bırakın Enter, ardından serbest bırakılması Ctrl .

Windows tarafından oluşturulan bir dosya üzerinde çalışıyorsanız

Zaten bir görünmez olduğundan yukarıdaki çözüm, mevcut satır aralarında bir satır daha katacak \rsonra ^M.

Bunu önlemek için, ^Mkarakterleri değiştirmeden silmek istersiniz .

:%s/<Ctrl-V><Ctrl-Enter>//g

Nerede %aracı "bu tamponda," svasıta "yerine," /araçlar "(bulmak) Aşağıdaki desen," <Ctrl-V><Ctrl-Enter>almak için tuşlara karşılık gelir ^M, (yukarıya bakınız) karakterini //desenle (veya" araçlar "hiçbir şey" boş olan bu iki eğik çizgi arasında) ve bir satırdaki ilk oluşumun aksine "küresel" anlamına gelen gbir bayraktır .


7

Bu benim için çalıştı:

  1. Dosya biçimini unix olarak ayarla ( \nsatır sonu)
  2. Dosya 'yı kaydet

Yani vim'de:

:set ff=unix
:w

1
Bu benim için çalıştı, kabul edilen cevap olmadı.
Marcello Romani

7

Benim durumumda,

Yukarıdaki hiçbir şey işe yaramadı, Mac bilgisayarımdan Linux makinesine kopyalanan bir CSV dosyası vardı ve yukarıdaki tüm komutları kullandım, ancak aşağıdakilerden başka hiçbir şey yardımcı olmadı

tr "\015" "\n" < inputfile > outputfile

^ M karakterleri aşağıdaki gibi satırlar arasında sandwitched bir dosya vardı

Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKT6TG,TRO_WBFB_500,Trico,CARS,Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKTG0A,TRO_WB_T500,Trico,


5
sed s/^M//g file1.txt > file2.txt

burada ^ M aynı anda 3 tuşa basılarak yazılır, ctrl + v + m


4

dosya windows üzerinde oluşturulmuşsa dos2unix yardımcı programını, mac üzerinde oluşturulmuşsa mac2unix yardımcı programını kullanın. :)


Daha önce hiç mac2unix duymadım, eğer tekrar yapabilirdi!
Kuf

Yaşasın! bu yol!
Özel



1

Tuş vuruşlarını kaydetmek için , bunu bir haritaya yerleştirerek Ctrl+ VCtrl+ yazmaktan kaçınabilirsiniz M. ^ M karakteri içeren bir dosyayı açmanız, çekmeniz ve .vimrc dosyanızdaki böyle bir satıra yapıştırmanız yeterlidir:

nnoremap <Leader>d :%s/^M//g<CR>

1

Bu önerilerin hiçbiri, ^Mhem vim hem de tutulma ile çalışırken bir miktar satır sonu almayı başardığım için çalışmıyordu. Dış bir dava ile karşılaştığımdan şüpheliyim ama yaptığım birine yardım etmesi durumunda.

:%s/.$//g

Ve sorunumu çözdü


Bu, bir satırın sonunda HERHANGİ bir karakteri kaldıracaktır. Herhangi bir nedenle ^ M ile sonlandırılmamış bir satırınız varsa, o karakteri de kaldırırsınız ve beklenmedik olur. Durum böyle olmamalı, ancak olması durumunda ve bunu bilmiyorsanız, dosyanızı tanımlamak çok zor olabilir.
Metagrapher

1
:g/^M/s// /g

^MKullanarak yazarsanızShift+6 Caps+M kabul etmez.

Yazmanız gerekiyor ctrl+v ctrl+m.


1

^Mistenmeyen satır sonları verir. Bunun üstesinden gelmek için sedkomutu aşağıdaki gibi kullanabiliriz :

sed 's/\r//g'

idk neden -1'ye indirildi ... sed kullanıyor çünkü? vim içinde aynı ikameyi yapabilirsiniz ve çalışması gerekir
Metagrapher 13:17

1

Sadece set binary.vimrc'nizden kaldırın !


Diğer bir iş parçacığında, yeni satırın otomatik eklentisinden kurtulmak için "set binary" önerildi.
dexter2305

1

sedMacOS'ta kullanmak için şunu yapın:

sed -i.bak $'s/\r//' <filename>

Açıklama: Buradaki $'STRING'sözdizimi bash kabuğuyla ilgilidir. Mac'ler \rözel karakter olarak değerlendirilmez. Komut dizesini belirterek $''kabuğa ANSI-C standardında belirtilen \rgerçek \rkarakterle yer değiştirmesini söylersiniz.


0

"Bu işlev atlamaların listesini korur

fun! Dos2unixFunction()
let _s=@/
let l = line(".")
let c = col(".")
try
    set ff=unix
    w!
    "%s/\%x0d$//e
catch /E32:/
    echo "Sorry, the file is not saved."
endtry
let @/=_s
call cursor(l, c)
endfun
com! Dos2Unix keepjumps call Dos2unixFunction()

Bu durumda, * NIX'in yerel dos2unix komutunu kullanmanın nesi yanlış? linux.die.net/man/1/dos2unix
Metagraf

0

Bir öğleden sonra \ n ctrl-v 012 (her ikisi de bana null kaynağı) ile mücadele ederek geçirdim. ve metagraflarınkine ulaşıncaya kadar bu iş parçacığıyla çalıştı.

\r benim için iyi çalıştı!

/),/s/),/)\r/g

böyle bir şey döndü:

kara liste-ekstra: i386 (0.4.1, 0.4.1 + nmu1), libmount1: i386 (2.20.1-5.1, 2.20.1 -5.2), libblkid1: i386 (2.20.1-5.1, 2.20.1-5.2) , libapt-pkg4.12: i386 (0.9.7.4, 0.9.7.5), nmap: i386 (6.00-0.1, 6.00-0.2), libsane-ortak: i386 (1.0.22-7.3,

böyle bir şeye:

26 libwv-1.2-4: i386 (1.2.9-3, otomatik)
27 openjdk-6-jre başsız: i386 (6b24-1.11.4-3, otomatik)
28 jed: i386 (0.99.19-2.1)

Sihirli. Çok minnettarım

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.