Как вы выполняете поиск файлов, содержащих окончания строк dos (CRLF), с помощью grep в Linux?

StackOverflow https://stackoverflow.com/questions/73833

  •  09-06-2019
  •  | 
  •  

Вопрос

Я хочу выполнить поиск файлов, содержащих окончания строк dos, с помощью grep в Linux.Что - то вроде этого:

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

Приведенное выше, по-видимому, соответствует буквальному rn а это совсем не то, чего хотелось бы.

Выходные данные этого будут переданы через xargs в todos для преобразования crlf в lf следующим образом

grep -IUrl --color '^M' . | xargs -ifile fromdos 'file'
Это было полезно?

Решение

Использование Ctrl+V, Ctrl+M чтобы ввести буквенный символ возврата каретки в вашу grep-строку.Итак:

grep -IUr --color "^M"

сработает - если ^M существует буквальный CR, который вы вводите, как я и предлагал.

Если вам нужен список файлов, вы хотите добавить -l тоже вариант.

Объяснение

  • -I игнорировать двоичные файлы
  • -U предотвращает удаление grep символов CR.По умолчанию он сделает это, если решит, что это текстовый файл.
  • -r рекурсивно считайте все файлы в каждом каталоге.

Другие советы

grep, вероятно, не тот инструмент, который вам нужен для этого.Он напечатает строку для каждой совпадающей строки в каждом файле.Если вы не хотите, скажем, запустить todos 10 раз в файле из 10 строк, grep - не лучший способ для этого.Используя find для запуска file для каждого файла в дереве, затем просматривая его для "CRLF", вы получите одну строку вывода для каждого файла, который имеет окончания строк в стиле dos:

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

получится у вас что-то вроде:

./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

Если ваша версия grep поддерживает -P (--perl-регулярное выражение) вариант, тогда

grep -lUP '\r$'

можно было бы использовать.

# 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

Запрос был поисковым...У меня похожая проблема...кто-то отправил смешанные окончания строк в систему управления версиями, так что теперь у нас есть куча файлов с 0x0d 0x0d 0x0a окончания строк.Обратите внимание , что

grep -P '\x0d\x0a'

находит все строки, тогда как

grep -P '\x0d\x0d\x0a'

и

grep -P '\x0d\x0d'

не находит строк, поэтому внутри grep может происходить что-то "еще" когда дело доходит до шаблонов окончания строк...к несчастью для меня!

Если, как и я, ваш минималистичный unix не включает в себя такие тонкости, как файл команда и обратная косая черта в вашем grep выражения просто не работают, попробуйте это:

$ 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

Изменения, которые вы, возможно, захотите внести в вышеперечисленное, включают:

  • настройте Найти команда для поиска только тех файлов, которые вы хотите отсканировать
  • измените свалка команда на передозировка или любая другая утилита для сброса файлов, которая у вас есть
  • подтвердите, что вырезать команда включает в себя как начальный, так и конечный пробел, а также просто шестнадцатеричный символ, выводимый из свалка полезность
  • ограничивать свалка выводите до первых 1000 символов или около того для повышения эффективности

Например, что-то вроде этого может сработать для вас, используя передозировка вместо того, чтобы свалка:

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

Вы можете использовать команду file в unix.Это дает вам кодировку символов файла вместе с ограничителями строк.

$ file myfile
myfile: ISO-8859 text, with CRLF line terminators
$ file myfile | grep -ow CRLF
CRLF  
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top