^ M (Windows satır başı) içeren dosyaları bulmak için grep


72

Linux kullanıyorum. Binlerce yapılandırma dosyasında gizlenmiş bir yerde sinir bozucu bir ^ M (Windows çıkıntısı dönüşü) var ve onu bulmam gerekiyor çünkü sunucunun başarısız olmasına neden oluyor.

Yapılandırma dosyaları ile dolu bir dizin hiyerarşisinde ^ M'yi nasıl bulabilirim?

Sanırım bash komut satırına ^ M giremiyorum. Ama ben m.txt dediğim bir metin dosyasında var



Windows ^ M ^ J
barlop olacak

3
Msgstr "bash komut satırına ^ M giremiyorum". Evet yapabilirsin. Control-V Control-M'yi deneyin
Hennes

Yanıtlar:


91
grep -r $'\r' *

-rÖzyinelemeli arama ve $''Bash'de c tarzı kaçış için kullanın .

Daha fazla, eğer onun metin dosyası olduğundan eminseniz, çalıştırması güvenli olmalı

tr -d $'\r' < filename

\rBir dosyadaki tüm kaldırmak için .

GNU kullanıyorsanız sed, -iyerinde düzenleme yapabilir, bu nedenle geri yazmak zorunda kalmazsınız:

sed $'s/\r//' -i filename

10
@ Nikel: ^ V ^ M tuşlarına basarak komut satırına ^ M girebilirsiniz, ancak kullanımı daha iyidir $'\r'.
Dennis Williamson,

Harika, işe yarıyor! ^ V ^ M numarası için de teşekkürler :-)
Nicolas Raoul

5
Cygwin'e göre, bu işi yapmak için -U gereklidir. Ve -n size satır numarasını söyleyecektir: grep -r -U -n -e $ '\ r'
Rainer Blome

4
Dosya adlarını görüntülemek için grep komutuna bir -l ekleyin. Aksi takdirde eşleşen çizgilerle bombalanmış olabilirsiniz.
Brendan Byrd

1
@uprego onları şimdi anlıyor musunuz emin değilsiniz ama fyi ve diğerleri, arama manpage'deki $'ilk hit'i okudu bash(1), temelde sanki C harfini yazıyormuş gibi görebilirsiniz. Gelince command < filename, kullanımı <ya da >denir yönlendirme bu kimsenin dediği gördük ilk kez, daha ifadesi . Arama REDIRECTIONiçinde bash(1).
livibetter

12

Denedim, bir tür çalışma olduğunu söyleyebilirim ama satırlar boş yazdırılıyordu. Seçeneğe ekle:

--color=never

Bu sorunu alırsanız, karakter vurgulamayı vurgulayan renklerin kaçış karakterleri olduğunu düşünüyorum \r.


2

Sunucunuzda bir bash kabuğu yoksa, alternatif, hazırlanmış bir dosyayla birlikte -fseçeneği kullanmaktır .grep\r

Dosyayı oluşturmak için:

$ echo -ne '\r' > /tmp/cr                    --or--                   $ printf '\r' > /tmp/cr

$ od -c /tmp/cr
0000000  \r
0000001

Aslında aramayı yapmak için

$ grep -f /tmp/cr *.html *.php *.asp *.whatever

ya da biraz tembel olabilir ve sadece yazabilirsiniz *,

$ grep -f /tmp/cr *

Açık seçeneği, her satıra bir tane olacak şekilde eşleşecek desenler içeren bir dosyayı belirtmek için kullanılır. Bu durumda sadece bir kalıp var.-f filenamegrep


2

Sorunuzu doğru anlarsam, gerçekten istediğiniz şey, tüm sonları Unix LF ( \x0a) standardına göre normalleştirmektir . CR'leri ( \x0d) sadece kör bir şekilde kaldırmakla aynı şey değil .

Çevresinde yeni satırlar için sadece CR kullanan Mac dosyalarınız varsa, bu dosyaları yok edersiniz. (Evet, Mac'lerin neredeyse 20 yıldan beri LF kullanmaları gerekiyor, ancak hala (2019'da) sadece CR kullanan birçok Mac uygulaması var).

Her türlü yeni \R çizgiyi değiştirmek için Perl'in çizgi kaçışını kullanabilirsiniz \n.

perl -i.bak -pe 's/\R/\n/g' $your_file

Bu birlikte yerinde LINEBREAK her türlü yerini alacak \nin $your_fileorijinal dosyanın bir yedeğini tutmak ${your_file}.bak.


1

Grep'i satır sonu karakterlerinde kullanmak için, grep dosyasının ikilik olduğunu söylemelisiniz.

-l (L harfi) sadece dosya adını yazdırmak içindir.

-P, perl regexp içindir (yani \ x0d, \ r veya ^ M olarak düzenlenir)

grep -l --binary -P '\x0d' *

0

Mac kullanıyorsanız ve homebrew kullanıyorsanız , şunları yapabilirsiniz:

brew install tofrodos
fromdos file.txt

tüm Windows satır satırlarını file.txt dosyasından çıkarmak için

Windows satırlarına geri dönmek için,

todos file.txt

Bir klasörde arama yapmak ve dos'dan gelen tüm dosyaları temizlemek için bu komutu çalıştırın: bulun. türü f adı "* .java" | todos xargs
Taiko

0

Düzenli ifade tarzında, çeşitli yeni satırlar:

Pencereler (CR LF)
\r\n

Unix (LF)
\n

Yana \r\nsırası oldukça benzersizdir, ben bunun için bu şekilde aramak gerekir sence?

İşleri daha kötü hale getirmek için Mac'lerin newline yerine sadece '' r 'si vardı. Bunu doğrulayamıyorum, ancak MacOSX neslinin artık böyle yaptığını sanmıyorum.

Eski Mac'ler (CR)
\r


M.txt içeren dizinde grep "\r\n" *sonuç olmaz. Ya yok sonuç egrep -e "\r\n" *negrep -E "\r\n" *
Nicolas Raoul

@ nicola ah, yanlış anladım .. sen CR sadece \rbenim kötü demek istedin . Tam bir pencere newline gerçekten \r\nveya CRLF
Jeff Atwood

0

Önceki cevapların ardından, 'tr' yöntemi iyidir:

533 $ eğer [[-n " tr -cd "\r" <~/.bashrc"]]; sonra yankı "DOS"; aksi takdirde "UNIX" ifadesini eko; fi

UNIX

534 $ eğer [[-n " tr -cd "\r" <dosfile.txt"]]; sonra yankı "DOS"; aksi takdirde "UNIX" ifadesini eko; fi

DOS

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.