it-swarm-id.com

Bagaimana Anda mencari file yang mengandung dos line endings (CRLF) dengan grep di Linux?

Saya ingin mencari file yang mengandung akhiran baris dos dengan grep di Linux. Sesuatu seperti ini:

grep -IUr --color '\r\n' .

Di atas tampaknya cocok dengan rn literal yang bukan yang diinginkan.

Output dari ini akan disalurkan melalui xargs ke todos untuk mengkonversi crlf ke lf seperti ini

grep -IUrl --color '^M' . | xargs -ifile fromdos 'file'
113
Tim Abell

Menggunakan Ctrl+VCtrl+M untuk memasukkan karakter Pengembalian Carriage literal ke string grep Anda. Begitu:

grep -IUr --color "^M"

akan berfungsi - jika ^M ada CR literal yang Anda masukkan seperti yang saya sarankan.

Jika Anda ingin daftar file, Anda ingin menambahkan -l Opsi juga.

Penjelasan

  • -I abaikan file biner
  • -U mencegah grep untuk menghapus karakter CR. Secara default itu akan melakukannya jika memutuskan itu adalah file teks.
  • -r baca semua file di bawah setiap direktori secara rekursif.
110
pjz

grep mungkin bukan alat yang Anda inginkan untuk ini. Ini akan mencetak baris untuk setiap baris yang cocok di setiap file. Kecuali jika Anda ingin, katakanlah, jalankan todos 10 kali pada file 10 baris, grep bukanlah cara terbaik untuk melakukannya. Menggunakan find untuk menjalankan file pada setiap file di pohon kemudian mengambil melalui itu untuk "CRLF" akan memberi Anda satu baris output untuk setiap file yang memiliki akhiran garis gaya dos:

find . -not -type d -exec file "{}" ";" | grep CRLF

akan memberi Anda sesuatu seperti:

./1/dos1.txt: ASCII text, with CRLF line terminators
./2/dos2.txt: ASCII text, with CRLF line terminators
./dos.txt: ASCII text, with CRLF line terminators
143
Thomee
49
Steven Penny

Jika versi grep Anda mendukung opsi - P (--Perl-regexp), maka

grep -lUP '\r$'

bisa digunakan.

16
Linulin
# list files containing dos line endings (CRLF)

cr="$(printf "\r")"    # alternative to ctrl-V ctrl-M

grep -Ilsr "${cr}$" . 

grep -Ilsr $'\r$' .   # yet another & even shorter alternative
7
yabt

Permintaannya adalah pencarian ... Saya memiliki masalah serupa ... seseorang mengirim akhir baris campuran ke dalam kontrol versi, jadi sekarang kami memiliki banyak file dengan 0x0d0x0d0x0a akhiran garis. Catat itu

grep -P '\x0d\x0a'

menemukan semua baris, sedangkan

grep -P '\x0d\x0d\x0a'

dan

grep -P '\x0d\x0d'

tidak menemukan garis sehingga mungkin ada sesuatu "lain" yang terjadi di dalam grep ketika datang ke pola garis akhir ... sayangnya bagi saya!

3
Peter Y

Anda dapat menggunakan perintah file di unix. Ini memberi Anda karakter pengkodean file bersama dengan terminator garis.

$ file myfile
myfile: ISO-8859 text, with CRLF line terminators
$ file myfile | grep -ow CRLF
CRLF  

Jika, seperti saya, unix minimalis Anda tidak menyertakan basa-basi seperti perintah file, dan backslash di ekspresi grep Anda tidak bekerja sama, coba ini:

$ for file in `find . -type f` ; do
> dump $file | cut -c9-50 | egrep -m1 -q ' 0d| 0d'
> if [ $? -eq 0 ] ; then echo $file ; fi
> done

Modifikasi yang mungkin ingin Anda lakukan di atas termasuk:

  • Tweak perintah find untuk menemukan hanya file yang ingin Anda pindai
  • ubah perintah dump ke od atau utilitas file dump apa pun yang Anda miliki
  • konfirmasikan bahwa perintah cut mencakup ruang terdepan dan tambahan serta hanya keluaran karakter heksadesimal dari utilitas dump
  • batasi dump output untuk 1000 karakter pertama atau lebih untuk efisiensi

Misalnya, sesuatu seperti ini dapat bekerja untuk Anda menggunakan od bukannya dump:

 od -t x2 -N 1000 $file | cut -c8- | egrep -m1 -q ' 0d| 0d|0d$'
1
MykennaC