Bagaimana cara mengetahui akhir baris dalam file teks?

304

Saya mencoba menggunakan sesuatu di bash untuk menunjukkan kepada saya akhiran baris dalam file yang dicetak daripada ditafsirkan. File ini adalah dump dari SSIS / SQL Server yang sedang dibaca oleh mesin Linux untuk diproses.

  • Apakah ada switch dalam vi, less, more, dll?

  • Selain melihat akhir baris, saya perlu tahu jenis akhir baris apa ( CRLFatau LF). Bagaimana saya mengetahui hal itu?

Marco Ceppi
sumber
1
Kiat umum: Jika Anda memiliki gagasan tentang perintah * nix / cygwin yang mungkin Anda gunakan, Anda selalu dapat melihat halaman manualnya untuk mencari sakelar yang mungkin memberi Anda fungsionalitas yang Anda butuhkan. Misalnya man less,.
David Rivers

Jawaban:

421

Anda dapat menggunakan fileutilitas untuk memberi Anda indikasi jenis akhir baris.

Unix:

$ file testfile1.txt
testfile.txt: ASCII text

"DOS":

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

Untuk mengonversi dari "DOS" ke Unix:

$ dos2unix testfile2.txt

Untuk mengonversi dari Unix ke "DOS":

$ unix2dos testfile1.txt

Mengonversi file yang sudah dikonversi tidak memiliki efek sehingga aman untuk dijalankan secara membabi buta (yaitu tanpa menguji formatnya terlebih dahulu) meskipun penolakan biasanya berlaku, seperti biasa.

Dijeda sampai pemberitahuan lebih lanjut.
sumber
9
Ini sekarang kadang-kadang dinamai "fromdos" dan "todos", masing-masing (seperti halnya di Ubuntu 10.4+)
Jess Chadwick
3
@ JessChadwick: Ya, tetapi hanya jika Anda secara eksplisit menginstal tofrodospaket dengan sudo apt-get install tofrodos- sama seperti Anda harus menjalankan sudo apt-get install dos2unixuntuk mendapatkan dos2unixdan unix2dos.
mklement0
Sebenarnya dos2unix tidak dapat melakukan semua pekerjaan, saya pikir stackoverflow.com/questions/23828554/dos2unix-doesnt-convert-m memberikan jawaban terbaik
nathan
@nathan: Apa yang dos2unixgagal di? OP pada pertanyaan itu hanya secara samar-samar menggambarkan masalah tersebut.
Dijeda sampai pemberitahuan lebih lanjut.
Perintah file @DennisWilliamson sebelum dan sesudah perintah dos2unix mendapatkan output yang sama: sumber xxx.c C, teks ASCII, dengan CR, LF line terminators. Saya menemukan file c ini memiliki ^ M di tengah baris yang suka xxxxxxx ^ M xxxxxxx
nathan
127

Dalam vi...

:set list untuk melihat garis akhir.

:set nolist untuk kembali normal.

Meskipun saya tidak berpikir Anda dapat melihat \natau \r\nmasuk vi, Anda dapat melihat jenis file apa itu (UNIX, DOS, dll.) Untuk menyimpulkan baris mana yang berakhir ...

:set ff

Atau, bashAnda dapat menggunakan od -t c <filename>atau hanya od -c <filename>untuk menampilkan pengembalian.

Ryan Berger
sumber
26
Sayangnya, saya tidak berpikir vi dapat menampilkan karakter spesifik tersebut. Anda dapat mencoba od -c <filename> yang saya yakin akan menampilkan \ n atau \ r \ n.
Ryan Berger
3
Dalam kategori "untuk apa nilainya" Anda dapat grep untuk CRLF gaya Dos dengan mengeluarkan grep --regex = "^ M" di mana ^ M adalah CTRL + V CTRL + M. Anda dapat menghapusnya dengan menggantinya dengan perintah sed. Ini pada dasarnya melakukan hal yang sama dengan dos2unix
cowboydan
11
Dalam vim: :set fileformatakan melaporkan mana unixatau dosvim yang berpikir akhir baris file berada. Anda dapat mengubahnya dengan :set fileformat=unix.
Victor Zamanian
5
Gunakan flag -b saat memulai vi / vim dan kemudian gunakan: set list untuk melihat akhiran CR (^ M) dan LF ($).
Samuel
1
@RyanBerger - Sepertinya Anda melewatkan -t. Seharusnya od -t c file/path, tapi terima kasih untuk program baru. Bekerja dengan baik!
Eric Fossum
113

Ubuntu 14.04:

cat -e <filename>pekerjaan sederhana baik-baik saja.

Ini menampilkan ujung garis Unix ( \natau LF) sebagai $dan ujung garis Windows ( \r\natau CRLF) sebagai ^M$.

Alexander Shelemin
sumber
7
Juga berfungsi di OSX. Solusi yang bagus Sederhana dan bekerja untuk saya sedangkan jawaban yang diterima tidak. (Catatan: bukan .txtfile)
dlsso
4
Apakah tampilan M $ sebuah easteregg / windows bashing?
Tom M
Tidak bekerja dengan Solaris, tetapi manusia mengatakan bahwa itu seharusnya bekerja
Zeus
101

Di bash shell, coba cat -v <filename>. Ini akan menampilkan carriage-returns untuk file windows.

(Ini bekerja untuk saya di rxvt via Cygwin pada Windows XP).

Catatan editor: cat -vmemvisualisasikan \rkarakter (CR). sebagai ^M. Dengan demikian, \r\nurutan akhir baris akan ditampilkan ^Mpada akhir setiap baris output. cat -ejuga akan memvisualisasikan \n, yaitu sebagai $. ( cat -ettambahan akan memvisualisasikan karakter tab. as ^I.)

warriorpostman
sumber
3
@ ChrisK: Coba echo -e 'abc\ndef\r\n' | cat -vdan Anda akan melihat ^Msetelah "def".
Dijeda sampai pemberitahuan lebih lanjut.
Saya ingin melihat apakah file tersebut memiliki ^ M (Windows / DOS EOL) dan hanya cat -v yang menunjukkan kepada saya. +1 untuk itu
Ali
1
^ M = gaya DOS / Windows
Merkurius
koreksi: Dengan demikian, urutan akhir baris \ r \ n akan ditampilkan sebagai ^ M $
Shayan
19

Untuk menampilkan CR seperti yang ^Mkurang digunakan less -uatau ketik -usekali kurang terbuka.

man less mengatakan:

-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.
P. Kucerak
sumber
1
Tolong jelaskan jawaban Anda.
adao7000
12

Coba filekemudian file -kkemudiandos2unix -ih

filebiasanya akan cukup. Tetapi untuk kasus yang sulit coba file -katau dosunix -ih.

Detail di bawah ini.


Mencoba file -k

Versi singkat: file -k somefile.txt akan memberi tahu Anda.

  • Ini akan menampilkan with CRLF line endingsakhir baris DOS / Windows.
  • Ini akan menampilkan with LF line endingsakhir MAC line.
  • Dan untuk Linux / Unix line "CR" itu hanya akan menampilkan text. (Jadi jika tidak secara eksplisit menyebutkan jenis line endingsmaka ini secara implisit berarti: "CR line endings" .)

Versi panjang lihat di bawah.


Contoh dunia nyata: Pengkodean Sertifikat

Terkadang saya harus memeriksa ini untuk file sertifikat PEM.

Masalahnya dengan teratur fileadalah ini: Terkadang ia mencoba menjadi terlalu pintar / terlalu spesifik.

Mari kita coba kuis kecil: Saya punya beberapa file. Dan salah satu dari file-file ini memiliki akhiran baris yang berbeda. Yang mana?

(Ngomong-ngomong: seperti inilah direktori "pekerjaan sertifikat" saya yang khas.)

Mari kita coba secara teratur 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

Hah. Itu tidak memberitahuku akhir baris. Dan saya sudah tahu bahwa itu adalah file cert. Saya tidak perlu "mengajukan" untuk mengatakan itu kepada saya.

Apa lagi yang bisa Anda coba?

Anda dapat mencoba dos2unixdengan --infosakelar seperti ini:

$ 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

Jadi itu memberitahu Anda bahwa: yup, "0.example.end.cer" pastilah orang yang aneh. Tapi ujung garis seperti apa yang ada? Apakah Anda tahu format output dos2unix dengan hati? (Bukan saya.)

Tapi untungnya ada opsi --keep-going(atau -ksingkatnya) di 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

Luar biasa! Sekarang kita tahu bahwa file ganjil kita memiliki CRLFakhiran baris DOS ( ). (Dan file-file lain memiliki LFakhiran baris Unix ( ). Ini tidak eksplisit dalam output ini. Ini implisit. Hanya cara filemengharapkan file teks "biasa" menjadi.)

(Jika Anda ingin membagikan mnemonik saya: "L" adalah untuk "Linux" dan untuk "LF".)

Sekarang mari kita ubah pelakunya dan coba lagi:

$ 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  

Baik. Sekarang semua sertifikat memiliki akhiran baris Unix.

Mencoba dos2unix -ih

Saya tidak tahu ini ketika saya menulis contoh di atas tetapi:

Sebenarnya dos2unix akan memberi Anda baris tajuk jika Anda menggunakan -ih(kependekan --info=h) seperti:

$ 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

Dan momen "sebenarnya" lainnya: Format tajuk sangat mudah diingat: Inilah dua mnemonik:

  1. Ini DUMB (kiri ke kanan: d untuk Dos, u untuk Unix, m untuk Mac, b untuk BOM).
  2. Dan juga: "DUM" hanyalah urutan abjad dari D, U dan M.

Bacaan lebih lanjut

StackzOfZtuff
sumber
1
Ini menghasilkan output seperti: Accounts.java: Java source, ASCII text\012-pada Windows di MinTTY
berdiri sendiri
@standalone: ​​menarik. Saya sudah membaca hal-hal aneh tentang opsi yang disebut "igncr" - dan apa yang Anda katakan terdengar seperti itu. Tetapi tidak dapat mereproduksi apa yang Anda gambarkan. (Saya mencoba di dalam Bash di dalam permen yang datang dengan Git-untuk-Windows, "git versi 2.24.0.windows.1".)
StackzOfZtuff
Hm, saya mencoba file -k Accounts.javadi dalam permen yang datang dengan git-for-windows juga, tetapi versi sayagit version 2.21.0.windows.1
berdiri sendiri
Solusi yang bekerja untuk saya adalahcat -e file_to_test
berdiri sendiri
9

Anda dapat menggunakan xxduntuk menampilkan dump hex file, dan mencari untuk "0d0a" atau "0a" karakter.

Anda dapat menggunakan cat -v <filename>seperti yang disarankan @warriorpostman.

Kaya
sumber
1
Ini bekerja untuk saya dengan cat v 8.23. Akhir baris Unix tidak akan mencetak info tambahan, tetapi ujung baris DOS akan mencetak "^ M".
Kaya
Itu pasti yang saya alami dengan 8.21, mengingat fakta bahwa saya menggunakan akhiran baris unix.
neanderslob
5

Anda dapat menggunakan perintah todos filenameuntuk mengkonversi ke ujung DOS, dan fromdos filenameuntuk mengubah ke ujung baris UNIX. Untuk menginstal paket di Ubuntu, ketik sudo apt-get install tofrodos.

Zorayr
sumber
5

Anda dapat menggunakan vim -b filenameuntuk mengedit file dalam mode biner, yang akan menampilkan ^ M karakter untuk carriage return dan baris baru menunjukkan LF yang hadir, menunjukkan ujung garis Windows CRLF. Maksud saya LF \ndan CR maksud saya \r. Perhatikan bahwa ketika Anda menggunakan opsi -b file akan selalu diedit dalam mode UNIX secara default seperti yang ditunjukkan oleh [unix]di baris status, yang berarti bahwa jika Anda menambahkan baris baru mereka akan berakhir dengan LF, bukan CRLF. Jika Anda menggunakan vim normal tanpa -b pada file dengan ujung garis CRLF, Anda akan melihat yang [dos]ditunjukkan di baris status dan baris yang disisipkan akan memiliki CRLF sebagai ujung baris. Dokumentasi vim untuk fileformatspengaturan menjelaskan kerumitan.

Juga, saya tidak memiliki cukup poin untuk mengomentari jawaban Notepad ++, tetapi jika Anda menggunakan Notepad ++ di Windows, gunakan menu View / Show Symbol / Show End of Line untuk menampilkan CR dan LF. Dalam hal ini LF ditampilkan sedangkan untuk vim LF ditunjukkan oleh baris baru.

perokok
sumber
0

Saya membuang output saya ke file teks. Saya kemudian membukanya di notepad ++ lalu klik tombol tampilkan semua karakter. Tidak terlalu elegan tapi berhasil.

Diego
sumber
3
Pertanyaan ini ditandai sebagai Linux dan saya kira notepad ++ untuk linux. Ini seharusnya bekerja untuk windows.
Rick Smith
0

Vim - selalu menampilkan baris baru Windows sebagai ^M

Jika Anda lebih suka untuk selalu melihat baris baru Windows di vim render ^M, Anda dapat menambahkan baris ini ke .vimrc:

set ffs=unix

Ini akan membuat vim menginterpretasikan setiap file yang Anda buka sebagai file unix. Karena file unix \nsebagai karakter baris baru, file windows dengan karakter baris baru \r\nmasih akan di-render dengan benar (terima kasih kepada \n) tetapi akan ada ^Mdi akhir file (yang merupakan cara vim merender \rkarakter).


Vim - terkadang menampilkan baris baru Windows

Jika Anda lebih suka mengaturnya per file, Anda dapat menggunakannya :e ++ff=unixsaat mengedit file yang diberikan.


Vim - selalu tampilkan tipe file ( unixvs dos)

Jika Anda ingin garis bawah vim untuk selalu menampilkan apa filetype Anda mengedit sedang (dan Anda tidak memaksa mengatur filetype untuk unix) Anda dapat menambahkan untuk Anda statuslinedengan
set statusline+=\ %{&fileencoding?&fileencoding:&encoding}.

Status lengkap saya disediakan di bawah ini. Cukup tambahkan ke .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+=\ 

Ini akan menjadi seperti

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

di bagian bawah file Anda


Vim - terkadang menampilkan tipe file ( unixvs dos)

Jika Anda hanya ingin melihat jenis file apa yang Anda miliki, Anda dapat menggunakan :set fileformat(ini tidak akan berfungsi jika Anda telah memaksa mengatur tipe file). Ini akan kembali unixuntuk file unix dan dosuntuk Windows.

profilprofil
sumber