Saya ingin mencari file yang berisi akhir baris dos dengan grep di Linux. Sesuatu seperti ini:
grep -IUr --color '\r\n' .
Hal di atas sepertinya cocok untuk literal rn
yang bukan yang diinginkan.
Output dari ini akan disalurkan melalui xargs ke todos untuk mengubah crlf ke lf seperti ini
grep -IUrl --color '^M' . | xargs -ifile fromdos 'file'
dos2unix
dengan-ic
sakelar. Untuk file LF Anda dapat mencari dengan unix2dos-ic
. Itu tidak mengubah file. Hanya laporkan.cat -v somefile.txt
; mereka muncul sebagai^M
Jawaban:
Gunakan Ctrl+ V, Ctrl+ Muntuk memasukkan karakter Carriage Return literal ke dalam string grep Anda. Begitu:
akan berfungsi - jika
^M
ada CR literal yang Anda masukkan seperti yang saya sarankan.Jika Anda menginginkan daftar file, Anda juga ingin menambahkan
-l
opsi.Penjelasan
-I
abaikan file biner-U
mencegah grep untuk menghapus karakter CR. Secara default itu akan melakukannya jika memutuskan itu adalah file teks.-r
membaca semua file di bawah setiap direktori secara rekursif.sumber
printf '\r'
grep $(printf '\r')
. Tetapi untuk sebagian besar penggunaan praktis yang melibatkan bash, saya akan tetap menggunakannya$'\r'
.-U
ini hanya relevan untuk Windows (atau cygwin), tetapi sangat penting di sana. Di Windows, perintah tidak akan berfungsi tanpanya.-I
? Secara manual, menurut saya file biner dianggap tidak cocok. Bukankah kombinasi dari-I
dan-U
(yang memberlakukan tipe biner) mengakibatkan semua file dianggap tidak cocok?grep mungkin bukan alat yang Anda inginkan untuk ini. Ini akan mencetak baris untuk setiap baris yang cocok di setiap file. Kecuali Anda ingin, katakanlah, menjalankan todos 10 kali pada file 10 baris, grep bukanlah cara terbaik untuk melakukannya. Menggunakan find untuk menjalankan file pada setiap file di pohon kemudian melakukan grep melalui itu untuk "CRLF" akan memberi Anda satu baris output untuk setiap file yang memiliki akhiran baris gaya dos:
akan memberi Anda sesuatu seperti:
sumber
grep -IUrl --color '^M' . | xargs -ifile fromdos 'file'
file
program (tidak berdokumen, berorientasi pada konsumsi manusia) . Ini sangat rapuh. Untuk (hanya satu) contoh: ini tidak berfungsi dengan file XML,file
laporanXML document text
terlepas dari jenis baris baru.-m /dev/null
di sayafind (GNU findutils) 4.4.2
(Ubuntu 12.04).find . -type f | xargs file | grep CRLF
menjelaskanshell.com - grep -IUlr
sumber
Jika versi grep Anda mendukung opsi -P (--perl-regexp) , maka
bisa digunakan.
sumber
sumber
Kueri adalah mencari ... Saya memiliki masalah yang sama ... seseorang mengirimkan akhiran baris campuran ke kontrol versi, jadi sekarang kami memiliki banyak file dengan
0x0d
0x0d
0x0a
akhiran baris. Catat itumenemukan semua baris, sedangkan
dan
tidak menemukan baris sehingga mungkin ada sesuatu "lain" yang terjadi di dalam grep ketika berhubungan dengan pola akhir baris ... sayangnya bagi saya!
sumber
Anda dapat menggunakan perintah file di unix. Ini memberi Anda pengkodean karakter file bersama dengan terminator baris.
sumber
Jika, seperti saya, unix minimalis Anda tidak menyertakan keramahan seperti perintah file , dan garis miring terbalik dalam ekspresi grep Anda tidak bekerja sama, coba ini:
Modifikasi yang mungkin ingin Anda lakukan di atas meliputi:
Misalnya, sesuatu seperti ini mungkin berhasil untuk Anda menggunakan od, bukan dump :
sumber
dos2unix
memiliki opsi informasi file yang dapat digunakan untuk menampilkan file yang akan dikonversi:Untuk melakukan itu secara rekursif Anda dapat menggunakan
bash
'sglobstar
pilihan, yang untuk shell saat diaktifkan denganshopt -s globstar
:Atau Anda dapat menggunakan
find
untuk itu:sumber