Saya menggunakan Linux. Ada ^ M sial (Windows cariage return) di suatu tempat tersembunyi di ribuan file konfigurasi, dan saya harus menemukannya, karena itu membuat server gagal.
Bagaimana saya menemukan ^ M di antara hierarki direktori yang penuh dengan file konfigurasi?
Saya pikir saya tidak bisa memasukkan ^ M pada baris perintah bash. Tapi saya memilikinya di file teks yang saya sebut m.txt
Jawaban:
Gunakan
-r
untuk pencarian rekursif dan$''
untuk c-style escape di Bash.Terlebih lagi, jika Anda yakin itu file teks, maka itu harus aman untuk dijalankan
untuk menghapus semua
\r
file.Jika menggunakan GNU
sed
,-i
dapat melakukan edit di tempat, jadi Anda tidak perlu menulis kembali:sumber
$'\r'
.$'
baca hit pertama di halaman manualbash(1)
, pada dasarnya, Anda dapat melihatnya seolah-olah Anda sedang menulis string literal C. Adapuncommand < filename
, penggunaan<
atau>
disebut redirection , ini pertama kali saya melihat ada yang menyebutnya ekspresi yang lebih besar . PencarianREDIRECTION
dibash(1)
.Ketika saya mencoba, saya bisa tahu itu semacam bekerja, tetapi garis-garisnya kosong. Tambahkan opsi:
Jika Anda mendapatkan masalah ini, saya pikir itu adalah karakter melarikan diri untuk menyoroti warna yang mengganggu
\r
karakter.sumber
Jika server Anda tidak memiliki bash shell, alternatifnya adalah menggunakan
-f
opsi aktifgrep
, dalam kombinasi dengan file yang disiapkan berisi\r
.Untuk membuat file:
Untuk benar-benar melakukan pencarian
atau Anda bisa sedikit malas dan cukup ketik *,
The pilihan pada digunakan untuk menentukan file yang berisi pola untuk mencocokkan, satu per baris. Dalam hal ini hanya ada satu pola.
-f filename
grep
sumber
Jika saya memahami pertanyaan Anda dengan benar, apa yang Anda inginkan adalah menormalkan semua akhir baris ke standar Unix LF (
\x0a
). Itu tidak sama dengan hanya menghapus CRs (\x0d
) secara membabi buta .Jika Anda memiliki beberapa file Mac yang hanya menggunakan CR untuk baris baru, Anda akan menghancurkan file-file itu. (Ya, Mac seharusnya menggunakan LF sejak hampir 20 tahun, tetapi masih ada (pada 2019) banyak aplikasi Mac yang hanya menggunakan CR).
Anda bisa menggunakan
\R
pelarian linebreak Perl untuk mengganti segala jenis baris baru dengan\n
.Ini akan menggantikan di tempat apapun linebreak dengan
\n
di$your_file
, menjaga cadangan dari file asli di${your_file}.bak
.sumber
Untuk menggunakan grep pada karakter end-of-line, saya kira Anda harus memberi tahu grep bahwa file tersebut adalah biner.
-l (huruf L) hanya untuk mencetak nama file
-P adalah untuk perl regexp (jadi \ x0d diubah ke \ r atau ^ M)
sumber
Jika Anda menggunakan Mac dan menggunakan homebrew , Anda dapat melakukannya:
untuk menghapus semua pengembalian carriage Windows dari file.txt
Untuk beralih kembali ke pengembalian carriage Windows,
sumber
Dalam gaya ekspresi reguler, berbagai baris baru:
Windows (CR LF)
\r\n
Unix (LF)
\n
Karena
\r\n
urutannya cukup unik, saya pikir Anda harus dapat mencarinya dengan cara itu?Untuk membuat segalanya lebih buruk, Mac dulu hanya memiliki 'r' di tempat baris baru. Saya tidak dapat memverifikasi ini, tetapi saya tidak berpikir generasi MacOSX melakukan itu lagi.
Mac Lama (CR)
\r
sumber
grep "\r\n" *
tidak memberikan hasil. Tidak ada hasil baik untukegrep -e "\r\n" *
maupungrep -E "\r\n" *
\r
buruk saya. Baris baru windows penuh memang\r\n
atau CRLFMenindaklanjuti jawaban sebelumnya, metode 'tr' bagus:
533 $ if [[-n "
tr -cd "\r" <~/.bashrc
"]]; kemudian gema "DOS"; selain itu gema "UNIX"; fiUNIX
534 $ if [[-n "
tr -cd "\r" <dosfile.txt
"]]; kemudian gema "DOS"; selain itu gema "UNIX"; fiDOS
sumber