Satırın sonundaki '^ M' karakteri


99

Unix ortamlarında belirli bir SQL betiğini çalıştırdığımda, komut satırına yankılanırken SQL betiğinin her satırının sonunda bir '^ M' karakteri görüyorum. SQL komut dosyasının orijinal olarak hangi işletim sisteminde oluşturulduğunu bilmiyorum.

Buna ne sebep oluyor ve bunu nasıl düzeltebilirim?

Yanıtlar:


79

DOS / Windows satır sonu karakterlerinden kaynaklanır. Andy Whitfield'ın dediği gibi, dos2unix Unix komutu sorunu çözmeye yardımcı olacaktır. Daha fazla bilgi istiyorsanız, bu komutun man sayfalarını okuyabilirsiniz.


3
Bazı sistemlerde (ör. Ubuntu) bu komutun adı "fromdos"
bobwienholt

6
brew install dos2unixHomebrew yüklediğinizde aracı OSX üzerinde çok kolay bir şekilde
edinebilirsiniz

73

viAşağıdakileri çalıştırarak satır sonlarını düzeltin :

:set fileformat=unix

:w


2
Bu harika bir cevap. Çok teşekkürler. (muhtemelen yalnızca bir kez kullanacağım bir araç olan dos2unix'i yüklerken kaydedildi)
Jamsi

3
bu ^M, bazı nedenlerden dolayı s'leri kaldırmaz . Referans dosyası: /etc/timidity/fluidr3_gm.cfg.
phil294

39

Nedeni, Windows tabanlı bir işletim sistemi ile Unix tabanlı bir işletim sisteminin satır sonu işaretleyicileri nasıl depoladığı arasındaki farktır.

Windows tabanlı işletim sistemleri, DOS mirası sayesinde, bir satır sonunu bir çift karakter olarak depolar - 0x0D0A(satır başı + satır besleme). Unix tabanlı işletim sistemleri yalnızca 0x0A(bir satır beslemesi ) kullanır. ^MGördüğünüz görsel bir temsilidir 0x0D(bir satırbaşı ).

dos2unix bu konuda yardımcı olacaktır. Muhtemelen komut dosyalarının kaynağını 'Unix dostu' olacak şekilde ayarlamanız gerekir.


Windows'un mevcut sürümlerinin herhangi bir DOS mirasına sahip olduğunu söyleyemem . Yine de uyumluluk kısıtlamaları var.
Joey

Bu kolay yol, otomatik bir dönüştürme aracı yapmaktır. Teşekkürler
Pjl

Ama neden ^M? Neden '^'? Neden 'M'?
1737973

Çünkü bu bir "kontrol karakteri". "^", kontrol anahtarına tıklamanın görsel temsilidir. ^, Yalnızca belirli baytlarının altında, düzenleyicinin onları nasıl temsil ettiğidir.
Hejazzman

24

En kolay yol kullanmaktır vi. Kulağa korkunç geldiğini biliyorum ama basit ve çoğu UNIX ortamında zaten kurulu. ^ M, Windows / DOS ortamından yeni bir satırdır.

komut isteminden: $ vi filename

Ardından :komut moduna geçmek için " " düğmesine basın .

Arama ve tüm dünyada olduğu Değiştir :%s/^M//g" daha sonra da basılı tutun kontrolü pres V M hiçbir şey ^ M yerini alacak".

Sonra yazmak ve çıkmak için " :wq" Bitti!


Emacs'de nasıl değiştirilir?
herbertD

Teşekkürler! VI (M) harika!
Ionică Bizău

3
^ M karakterinin nasıl yazılacağına dair açıklama için teşekkürler! Onun yerine \ r ile değiştirirdim. Ben de yaptım:% s / ^ M / \ r / g
aharris88


10

Vi'de bir :%s/^M//g

Almak için ^Mbeklemeye CTRLtuşuna basın Vardından M(Her iki Ctrl tuşunu basılı tutarken) ve ^Mgörünecektir. Bu, tüm olayları bulacak ve bunların yerine hiçbir şey koymayacaktır.


2
^ M'yi unix dostu bir satır sonu ile değiştirmek için::%s/^M/\r/g
Gary Oak

8

SQL komut dosyası orijinal olarak bir Windows işletim sisteminde oluşturulmuştur. '^ M' karakterleri, Windows ve Unix'in bir satır sonu karakteri için ne kullanılacağı konusunda farklı fikirlere sahip olmasının bir sonucudur. Bunu düzeltmek için komut satırında perl kullanabilirsiniz.

perl -pie 's/\r//g' filename.txt

Elbette, perl kullanabilirsiniz, ancak dos2unix yerine perl önerir misiniz?
Thomas Owens

2
Ben sadece bir alternatif sunuyorum, çünkü zaten dört kişi dos2unix'i kullanmalarını söyledi.
Bill the Lizard

2
Evet, bunu yararlı buldum çünkü tarih öncesi bir BT departmanına sahip bir ofiste çalışan geriye dönük bir iş istasyonundayım. Bir varyasyon kullanmam dışında: perl -pi -e "s / \ x0D / \ n / g" file.csv
Rimian

7

^ M, tipik olarak Windows operatörü satırsonlarından kaynaklanır ve Unix'e çevrilmiş bir ^ M gibi görünür. Dos2unix komutu onları güzelce kaldırmalı

dos2unix [seçenekler] [-c convmode] [-o dosya ...] [-n dosya çıktısı ...]


5
C:\tmp\text>dos2unix hello.txt helloUNIX.txt

Sed daha da yaygın olarak bulunur ve dos2unix kurulu değilse de bu tür şeyleri yapabilir.

C:\tmp\text>sed s/\r// hello.txt > helloUNIX.txt  

Ayrıca tr'yi deneyebilirsiniz:

cat hello.txt | tr -d \r > helloUNIX2.txt  

Sonuçlar burada:

C:\tmp\text>dumphex hello.txt  
00000000h: 48 61 68 61 0D 0A 68 61 68 61 0D 0A 68 61 68 61 Haha..haha..haha  
00000010h: 0D 0A 0D 0A 68 61 68 61 0D 0A                   ....haha..  

C:\tmp\text>dumphex helloUNIX.txt  
00000000h: 48 61 68 61 0A 68 61 68 61 0A 68 61 68 61 0A 0A Haha.haha.haha..  
00000010h: 68 61 68 61 0A                                  haha.  

C:\tmp\text>dumphex helloUNIX2.txt  
00000000h: 48 61 68 61 0A 68 61 68 61 0A 68 61 68 61 0A 0A Haha.haha.haha..  
00000010h: 68 61 68 61 0A                                  haha.  

4

Vi düzenleyicideki ^ M karakterlerini değiştirmek için aşağıdakileri kullanın

metin dosyasını açın t1.txt deyin

vi t1.txt

Tuşuna basarak komut moduna girin shift + :

ardından belirtildiği gibi tuşlara basın %s/^M/\r/g

in above ^M is not (shift + 6)M instead it is (ctrl + V)(ctrl + M)

Son satırınız, önceki cevapların hepsinde eksik olan şeydi. 'Bc eşleşme bulunamadı' diye devam ettim. Shift + 6 yapıyordum, bu yüzden her hacker'ın yapacağını yaptım ve yanlış anlamamı kendi çözümümle aştım: her satırın sonuna gitmek için $ yapmak için bir makro kaydedin ve sonra x'e basın, sadece dosyadaki satır sayısı için makroyu tekrarlayın.
darethas

3

dos2unixKomutun bir alternatifi gibi standart yardımcı programları kullanmak olabilir sed.

Örneğin, unix'e dos:

sed 's/\r$//' dos.txt > unix.txt

unix to dos:

sed 's/$/\r/' unix.txt > dos.txt

1

^ M'yi doğrudan sed komutuyla dosyalardan kaldırabilirsiniz, örneğin:

sed -i'.bak' s/\r//g *.*

Değişikliklerden memnunsanız, .bak dosyalarını kaldırın:

rm -v *.bak


0

od -a $file Linux'ta bu tür soruları araştırmak için kullanışlıdır (yukarıdaki dumphex'e benzer).


0

Perl'de, $ / değişkenini ayarlamak ve chomp () kullanmak istemiyorsanız, şunları da yapabilirsiniz:

$var =~ /\r\n//g;

Benim görüşüm


-1

İşe yarayacak başka bir vi komutu: :%s/.$// Bu, dosyadaki her satırın son karakterini kaldırır. Bu arama ve değiştirme komutunun dezavantajı, son karakterin ne olduğu umurunda olmamasıdır, bu yüzden onu iki kez adlandırmamaya dikkat edin.


Güvenilir olmadığını biliyorsan neden bundan bahsediyorsun?
minexew
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.