Как искать файлы, содержащие доводные строки end (CRLF) с grep в Linux?

Я хочу искать файлы с выводами dos line с grep в Linux. Что-то вроде этого:

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

Выше, похоже, соответствует буквальное rn, которое не является желательным.

Результат этого будет передаваться через xargs в todos, чтобы преобразовать crlf в lf, как этот

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

Ответ 1

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

grep -IUr --color "^M"

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

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

Объяснение

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

Ответ 2

grep, вероятно, не тот инструмент, который вы хотите для этого. Он будет печатать строку для каждой соответствующей строки в каждом файле. Если вы не хотите, скажем, запустить todos 10 раз в файле с 10 строками, grep - это не лучший способ сделать это. Используя find для запуска файла по каждому файлу в дереве, grepping через это для 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

Ответ 4

Если ваша версия grep поддерживает опцию -P (--perl-regexp), то

grep -lUP '\r$'

.

Ответ 5

# 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

Ответ 6

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

grep -P '\x0d\x0a'

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

grep -P '\x0d\x0d\x0a'

и

grep -P '\x0d\x0d'

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

Ответ 7

Если, как и я, ваш минималистский unix не включает в себя такие тонкости, как команда file, а обратные косые черты в выражениях 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

Модификации, которые вы, возможно, захотите сделать, включают:

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

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

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

Ответ 8

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

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