Bir metin dosyasındaki satır sonlarını nasıl bulabilirim?


304

Ben yorumlanmış bir dosyada yazdırılan bir dosyada satır sonlarını göstermek için bash bir şey kullanmaya çalışıyorum. Dosya, bir Linux makinesi tarafından işlenmek üzere okunan SSIS / SQL Server dökümüdür.

  • İçinde herhangi anahtarlar var mıdır vi, less, more, vs?

  • Satır sonlarını görmeye ek olarak, ne tür bir satır sonu olduğunu da bilmeliyim ( CRLFveya LF). Bunu nasıl bulabilirim?


1
Genel ipucu: Hangi * nix / cygwin komutunu kullanabileceğinize dair bir fikriniz varsa, ihtiyacınız olan işlevselliği sağlayabilecek anahtarları aramak için her zaman onun sayfasını görüntüleyebilirsiniz. Ör man less.
David Rivers

Yanıtlar:


421

Sen kullanabilirsiniz filesize satır sonları türünden bir fikir vermesi için yardımcı programı.

Unix:

$ file testfile1.txt
testfile.txt: ASCII text

"DOS":

$ file testfile2.txt
testfile2.txt: ASCII text, with CRLF line terminators

"DOS" dan Unix'e dönüştürmek için:

$ dos2unix testfile2.txt

Unix'ten "DOS" a dönüştürmek için:

$ unix2dos testfile1.txt

Önceden dönüştürülmüş bir dosyayı dönüştürmenin bir etkisi yoktur, bu nedenle olağan feragatnameler her zaman olduğu gibi uygulanmasına rağmen körü körüne çalıştırmak (yani, önce biçimi test etmeden) güvenlidir.


9
Bunlar şimdi bazen "fromdos" ve "todos" olarak adlandırılmaktadır (Ubuntu 10.4+ sürümünde olduğu gibi)
Jess Chadwick

3
Açıkça yüklemek Evet, ama sadece eğer: @JessChadwick tofrodosile paketi sudo apt-get install tofrodosçalıştırmak zorunda kalacak gibi - sudo apt-get install dos2unixalmak dos2unixve unix2dos.
mklement0

Aslında dos2unix tüm işi yapamaz, sanırım stackoverflow.com/questions/23828554/dos2unix-doesnt-convert-m en iyi cevabı veriyor
nathan

@nathan: Nede dos2unixbaşarısız oluyor? Bu sorudaki OP sorunu sadece belirsiz bir şekilde açıklamaktadır.
sonraki duyuruya kadar duraklatıldı.

DosDunix komutundan önce ve sonra @DennisWilliamson dosya komutu aynı çıktıya sahipti: xxx.c C kaynağı, ASCII metni, CR, LF satır sonlandırıcıları. Ben bu c dosya xxxxxxx seviyor satırın ortasında ^ M olduğunu bulundu ^ M xxxxxxx
nathan

127

İçinde vi...

:set list satır sonlarını görmek için.

:set nolist normale dönmek.

Görebildiğinizi \nveya \r\niçinde olduğunu düşünmese de vi, hangi satır sonlarına sahip olduğunu belirlemek için hangi dosya türünü (UNIX, DOS, vb.) Görebilirsiniz ...

:set ff

Alternatif olarak, dönüşleri görüntülemek için veya düğmesini bashkullanabilirsiniz .od -t c <filename>od -c <filename>


26
Maalesef vi'nun bu belirli karakterleri gösterebileceğini sanmıyorum. \ N veya \ r \ n göstereceğine inandığım od -c <filename> komutunu deneyebilirsiniz.
Ryan Berger

3
"Değeri ne olursa olsun" kategorisinde grep --regex = "^ M" düzenleyerek Dos stili CRLF için grep yapabilirsiniz, burada ^ M CTRL + V CTRL + M'dir. Bunları sed komutuyla değiştirerek bunları kaldırabilirsiniz. Bu aslında dos2unix ile aynı şeyi yapar
cowboydan

11
Vim: dosyanın satır sonlarından :set fileformathangisinin unixveya dosvim olduğunu düşündüğünü bildirir . Tarafından değiştirebilirsiniz :set fileformat=unix.
Victor Zamanian

5
Vi / vim'i başlatırken -b bayrağını kullanın ve sonra CR (^ M) ve LF ($) sonlarını görmek için: set list komutunu kullanın.
Samuel

1
@RyanBerger - Görünüşe göre a -t eksik. Olmalı od -t c file/path, ancak yeni program için teşekkürler. Harika çalıştı!
Eric Fossum

113

Ubuntu 14.04:

basit iyi cat -e <filename>çalışır.

Bu, Unix satır sonlarını ( \nveya LF) $ve Windows satır sonlarını ( \r\nveya CRLF) olarak görüntüler ^M$.


7
OSX üzerinde de çalışır. Güzel çözüm. Basit ve benim için çalıştı kabul edilen cevap vermedi. (Not: bir .txtdosya değildi )
dlsso

4
M $ bir easteregg / windows dayak nedir?
Tom M

Solaris ile çalışmaz, ama adam işe yaraması gerektiğini söylüyor
Zeus

101

Bash kabuğunda, dene cat -v <filename>. Bu, Windows dosyaları için satır başlarını görüntülemelidir.

(Bu benim için Windows XP'de Cygwin üzerinden rxvt'de çalıştı).

Editörün notu: (CR) karakterlerini cat -vgörselleştirir \r. olarak ^M. Böylece, satır sonu \r\ndizileri ^Mher bir çıkış çizgisinin sonunda olduğu gibi görüntülenecektir . cat -eilave olarak görselleştirmek olacak \nyani gibi $. ( cat -etsekme karakterlerini ek olarak görselleştirecektir ^I.)


3
@ChrisK: Deneyin echo -e 'abc\ndef\r\n' | cat -vve ^Msonra bir "def" görmelisiniz .
sonraki duyuruya kadar duraklatıldı.

Dosyanın ^ M (Windows / DOS EOL) olup olmadığını görmek istedim ve sadece kedi -v bana bunu gösterdi. Bunun için +1
Ali

1
^ M = DOS / Windows stili
Mercury

düzeltme: Böylece, satır sonu \ r \ n dizileri ^ M $
Shayan

19

CR'yi ^Mdaha az kullanımda gibi göstermek less -uveya bir -ukez daha az açık yazmak.

man less diyor:

-u or --underline-special

      Causes backspaces and carriage returns to be treated  as  print-
      able  characters;  that  is,  they are sent to the terminal when
      they appear in the input.

1
Lütfen cevabınızı netleştirin.
adao7000

12

fileO file -kzaman denedos2unix -ih

filegenellikle yeterli olacaktır. Ancak zor vakalar için deneyin file -kveya dosunix -ih.

Detaylar aşağıda.


Deneyin file -k

Kısa versiyon: file -k somefile.txt söyleyecektir.

  • with CRLF line endingsDOS / Windows satır sonları için çıktı alır .
  • with LF line endingsMAC satırı sonları için çıktı alır .
  • Ve Linux / Unix hattı "CR" için sadece çıktı text. (Yani herhangi bir türden açıkça bahsetmezse, line endingsbu dolaylı olarak şu anlama gelir: "CR satır sonları" .)

Uzun versiyon aşağıya bakınız.


Gerçek dünya örneği: Sertifika Kodlaması

Bazen bunu PEM sertifika dosyaları için kontrol etmek zorundayım.

Düzenli ile ilgili sorun fileşudur: Bazen çok akıllı / çok spesifik olmaya çalışıyor.

Biraz bilgi yarışması yapalım: Dosyalarım var. Ve bu dosyalardan birinin satır sonları farklı. Hangisi?

(Bu arada: tipik "sertifika çalışması" dizinlerimden biri böyle görünüyor.)

Düzenli deneyelim file:

$ file -- *
0.example.end.cer:         PEM certificate
0.example.end.key:         PEM RSA private key
1.example.int.cer:         PEM certificate
2.example.root.cer:        PEM certificate
example.opensslconfig.ini: ASCII text
example.req:               PEM certificate request

Huh. Bana satır sonlarını söylemiyor. Bunların sertifika dosyaları olduğunu zaten biliyordum . Bunu söylemek için "dosyaya" ihtiyacım yoktu.

Başka ne deneyebilirsin?

Sen deneyebilirsiniz dos2unixile --infoböyle anahtarı:

$ dos2unix --info -- *
  37       0       0  no_bom    text    0.example.end.cer
   0      27       0  no_bom    text    0.example.end.key
   0      28       0  no_bom    text    1.example.int.cer
   0      25       0  no_bom    text    2.example.root.cer
   0      35       0  no_bom    text    example.opensslconfig.ini
   0      19       0  no_bom    text    example.req

Bu size şunu söyler: evet, "0.example.end.cer" dışarıdaki tek adam olmalı. Ama ne tür çizgi sonları var? Do Eğer ezbere dos2unix çıktı biçimini biliyor? (Yapmıyorum.)

Ancak neyse ki, --keep-going(veya -kkısaca) seçeneği var file:

$ file --keep-going -- *
0.example.end.cer:         PEM certificate\012- , ASCII text, with CRLF line terminators\012- data
0.example.end.key:         PEM RSA private key\012- , ASCII text\012- data
1.example.int.cer:         PEM certificate\012- , ASCII text\012- data
2.example.root.cer:        PEM certificate\012- , ASCII text\012- data
example.opensslconfig.ini: ASCII text\012- data
example.req:               PEM certificate request\012- , ASCII text\012- data

Mükemmel! Artık tek dosyamızın DOS ( CRLF) satır sonları olduğunu biliyoruz . (Ve diğer dosyaların Unix ( LF) satır sonları vardır. Bu çıktıda bu açık değildir. Örtük. Sadece file"normal" bir metin dosyasının olmasını beklediği gibi.)

(Anımsatıcımı paylaşmak istiyorsanız: "L", "Linux" ve "LF" içindir.)

Şimdi suçluyu dönüştürelim ve tekrar deneyelim:

$ dos2unix -- 0.example.end.cer

$ file --keep-going -- *
0.example.end.cer:         PEM certificate\012- , ASCII text\012- data
0.example.end.key:         PEM RSA private key\012- , ASCII text\012- data
1.example.int.cer:         PEM certificate\012- , ASCII text\012- data
2.example.root.cer:        PEM certificate\012- , ASCII text\012- data
example.opensslconfig.ini: ASCII text\012- data
example.req:               PEM certificate request\012- , ASCII text\012- data  

İyi. Artık tüm sertifikaların Unix çizgi sonları var.

Deneyin dos2unix -ih

Yukarıdaki örneği yazarken bunu bilmiyordum ama:

Aslında, eğer böyle kullanırsanız -ih(kısa --info=h) , dos2unix'in size bir başlık satırı vereceği ortaya çıkıyor :

$ dos2unix -ih -- *
 DOS    UNIX     MAC  BOM       TXTBIN  FILE
   0      37       0  no_bom    text    0.example.end.cer
   0      27       0  no_bom    text    0.example.end.key
   0      28       0  no_bom    text    1.example.int.cer
   0      25       0  no_bom    text    2.example.root.cer
   0      35       0  no_bom    text    example.opensslconfig.ini
   0      19       0  no_bom    text    example.req

Ve bir başka "aslında" an: Başlık formatını hatırlamak gerçekten çok kolay: İşte iki anımsatıcı:

  1. DUMB (soldan sağa: Dos için d, Unix için u, Mac için m, BOM için b).
  2. Ve ayrıca: "DUM" sadece D, U ve M'nin alfabetik sıralamasıdır.

daha fazla okuma


1
Şu şekilde çıktı üretir: Accounts.java: Java source, ASCII text\012-MinTTY'de Windows'ta
tek başına

@standalone: ​​ilginç. "İgncr" adlı bir seçenekle ilgili söylediklerinizle ilgili garip şeyler okudum. Ama tarif ettiklerinizi çoğaltamazsınız. (Ben Git-for-Windows, "git version 2.24.0.windows.1" ile gelen nane içinde Bash içinde denedim.)
StackzOfZtuff

Hm, ben file -k Accounts.javade windows için git ile gelen nane içinde denedim , ama benim sürümgit version 2.21.0.windows.1
tek başına

Benim için çalışma çözümücat -e file_to_test
tek başına

9

Sen kullanabilirsiniz xxddosyasının bir altıgen dökümü göstermek ve "0d0a" veya "0a" karakter için avlamak için.

cat -v <filename>@Warriorpostman'ın önerdiği gibi kullanabilirsiniz .


1
Benim için kedi v 8.23 ​​ile çalışıyor. Unix satır sonları fazladan bilgi yazdırmaz, ancak DOS satır sonları "^ M" yazdırır.
Zengin

Unix satır sonlarını kullandığım göz önüne alındığında, 8.21 ile karşılaştığım şey bu olmalı.
neanderslob

5

Bu komutu todos filenameDOS sonlarına fromdos filenamedönüştürmek ve UNIX satır sonlarına dönüştürmek için kullanabilirsiniz. Paketi Ubuntu'ya kurmak için yazın sudo apt-get install tofrodos.


5

vim -b filenameBir dosyayı ikili modda düzenlemek için kullanabilirsiniz ; bu, satır başı için ^ M karakterleri gösterir ve yeni bir satır, LF'nin mevcut olduğunu gösterir ve Windows CRLF satır sonlarını gösterir. LF ile kastediyorum \nve CR ile kastediyorum \r. -B seçeneğini kullandığınızda dosyanın [unix]durum satırında belirtildiği gibi varsayılan olarak her zaman UNIX modunda düzenleneceğini , yani yeni satırlar eklerseniz CRLF ile bitmeyeceklerini unutmayın. CRLF satır sonlarına sahip bir dosyada -b olmadan normal vim kullanırsanız [dos], durum satırında gösterileni görürsünüz ve eklenen satırlar satır sonu olarak CRLF'ye sahip olur. Ayar için vim belgeleri fileformatskarmaşıklıkları açıklar.

Ayrıca, Notepad ++ yanıtı için yorum yapmak için yeterli noktam yok, ancak Windows'ta Notepad ++ kullanıyorsanız, CR ve LF'yi görüntülemek için Görünüm / Göster Sembolü / Satır Sonunu Göster menüsünü kullanın. Bu durumda LF gösterilirken vim için LF yeni bir çizgi ile gösterilir.


0

Çıktımı bir metin dosyasına döküyorum. Daha sonra notepad ++ ile açtım ve sonra tüm karakterleri göster düğmesine tıklayın. Çok zarif değil ama işe yarıyor.


3
Bu soru Linux olarak etiketlendi ve notepad ++ linux için olduğunu sanmıyorum. Bu olsa pencereler için çalışması gerekir.
Rick Smith

0

Vim - her zaman Windows satırlarını şu şekilde göster ^M

Vim render'daki Windows yeni satırlarını her zaman olarak görmeyi tercih ediyorsanız ^M, bu satırı şuraya ekleyebilirsiniz .vimrc:

set ffs=unix

Bu, vim'in açtığınız her dosyayı bir unix dosyası olarak yorumlamasını sağlayacaktır. Unix dosyaları \nyeni satır karakterine sahip olduğundan , yeni satır karakterine sahip bir windows dosyası \r\nyine de düzgün şekilde işleyecektir (sayesinde \n) ancak ^Mdosyanın sonunda olacaktır (vim \rkarakteri bu şekilde oluşturur).


Vim - bazen Windows satırlarını göster

Yalnızca dosya başına ayarlamayı tercih ederseniz, :e ++ff=unixbelirli bir dosyayı düzenlerken kullanabilirsiniz .


Vim - her zaman dosya türünü göster ( unixvs dos)

Hep sen düzenleme filetype (ve Unix için filetype zorla set vermedi) neyi görüntülemek için vim alt çizgi istiyorsanız size ekleyebileceğiniz statuslineile
set statusline+=\ %{&fileencoding?&fileencoding:&encoding}.

Durumumun tamamı aşağıda verilmiştir. Sadece ekleyin .vimrc.

" Make statusline stay, otherwise alerts will hide it
set laststatus=2
set statusline=
set statusline+=%#PmenuSel#
set statusline+=%#LineNr#
" This says 'show filename and parent dir'
set statusline+=%{expand('%:p:h:t')}/%t
" This says 'show filename as would be read from the cwd'
" set statusline+=\ %f
set statusline+=%m\
set statusline+=%=
set statusline+=%#CursorColumn#
set statusline+=\ %y
set statusline+=\ %{&fileencoding?&fileencoding:&encoding}
set statusline+=\[%{&fileformat}\]
set statusline+=\ %p%%
set statusline+=\ %l:%c
set statusline+=\ 

Gibi olacak

.vim/vimrc\                                    [vim] utf-8[unix] 77% 315:6

dosyanızın alt kısmında


Vim - bazen filetype'ı göster ( unixvs dos)

Sadece ne tür bir dosyanız olduğunu görmek istiyorsanız, kullanabilirsiniz :set fileformat( dosya türünü zorla ayarlarsanız bu çalışmaz). unixUnix dosyaları ve dosWindows için geri dönecektir .

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.