Chcę wyszukać pliki zawierające zakończenia wierszy dos za pomocą grep w systemie Linux. Coś takiego:
grep -IUr --color '\r\n' .
Powyższe wydaje się pasować do dosłownego, rn
co nie jest tym, co jest pożądane.
Wynik tego zostanie przesłany potokiem przez xargs do todos, aby przekonwertować crlf na lf w ten sposób
grep -IUrl --color '^M' . | xargs -ifile fromdos 'file'
dos2unix
z-ic
przełącznikiem. W przypadku plików LF możesz wyszukiwać za pomocą unix2dos-ic
. Nie modyfikuje plików. Tylko raport.cat -v somefile.txt
; pojawiają się jako^M
Odpowiedzi:
Użyj Ctrl+ V, Ctrl+, Maby wprowadzić literalny znak powrotu karetki do łańcucha grep. Więc:
zadziała - jeśli
^M
istnieje dosłowna CR, którą wprowadzasz, jak sugerowałem.Jeśli chcesz listę plików, chcesz również dodać tę
-l
opcję.Wyjaśnienie
-I
ignoruj pliki binarne-U
zapobiega usuwaniu przez grep znaków CR. Domyślnie zrobi to, jeśli zdecyduje, że jest to plik tekstowy.-r
czyta rekurencyjnie wszystkie pliki w każdym katalogu.źródło
printf '\r'
grep $(printf '\r')
. Ale w przypadku większości praktycznych zastosowań obejmujących bash trzymałbym się$'\r'
.-U
dotyczy tylko systemu Windows (lub cygwin), ale jest tam krytyczna. W systemie Windows polecenie nie zadziała bez niego.-I
? Zgodnie z instrukcją wydaje mi się, że pliki binarne są uznawane za niepasujące. Czy kombinacja-I
i-U
(która wymusza typ binarny) nie powinna skutkować uznaniem wszystkich plików za niepasujące?grep prawdopodobnie nie jest narzędziem, którego potrzebujesz do tego. Wypisze linię dla każdej pasującej linii w każdym pliku. Jeśli nie chcesz, powiedzmy, uruchomić todos 10 razy na pliku 10-liniowym, grep nie jest najlepszym sposobem, aby to zrobić. Użycie find, aby uruchomić plik na każdym pliku w drzewie, a następnie przeszukanie tego dla "CRLF" da ci jedną linię wyjścia dla każdego pliku, który ma zakończenia linii w stylu dos:
dostaniesz coś takiego:
źródło
grep -IUrl --color '^M' . | xargs -ifile fromdos 'file'
file
programu. To jest bardzo delikatne. Na (tylko jeden) przykład: nie działa z plikami XML,file
raportamiXML document text
niezależnie od typu nowych linii.-m /dev/null
na moimfind (GNU findutils) 4.4.2
(Ubuntu 12.04).find . -type f | xargs file | grep CRLF
wyjaśniahell.com - grep -IUlr
źródło
Jeśli twoja wersja grep obsługuje opcję -P (--perl-regexp) , to
może być użyty.
źródło
źródło
Zapytaniem było wyszukiwanie ... Mam podobny problem ... Ktoś przesłał mieszane zakończenia wierszy do kontroli wersji, więc teraz mamy kilka plików z
0x0d
0x0d
0x0a
zakończeniami wierszy. Zwróć na to uwagęznajduje wszystkie wiersze, podczas gdy
i
nie znajduje linii, więc może być coś „innego” w grep, jeśli chodzi o wzorce zakończenia linii ... niestety dla mnie!
źródło
Możesz użyć polecenia pliku w systemie unix. Zapewnia kodowanie znaków pliku wraz z terminatorami linii.
źródło
Jeśli, tak jak ja, twój minimalistyczny unix nie zawiera subtelności, takich jak polecenie pliku , a ukośniki odwrotne w wyrażeniach grep po prostu nie współpracują, spróbuj tego:
Modyfikacje, które możesz chcieć wprowadzić w powyższym, obejmują:
Na przykład coś takiego może zadziałać, używając od zamiast dump :
źródło
dos2unix
ma opcję informacji o pliku, której można użyć do wyświetlenia plików, które zostaną przekonwertowane:Aby zrobić to rekursywnie można użyć
bash
„sglobstar
opcję, która dla bieżącej powłoki jest włączonashopt -s globstar
:Alternatywnie możesz użyć
find
do tego:źródło