Как вам искать файлы, содержащие Дос конца строки (возврата каретки и перевода строки) с помощью команды grep в Linux?



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



grep -IUr --color 'rn' .


выше, кажется, соответствует буквальному rn это не то, что нужно.



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



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

8 ответов:

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

grep -IUr --color "^M"

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

если вы хотите список файлов, вы хотите добавить Как хорошо.

объяснение

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

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
grep -IUlr $'\r'

explainshell.com -grep-IUlr

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

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 0x0d0x0a линия окончаний. Обратите внимание, что

grep -P '\x0d\x0a'

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

grep -P '\x0d\x0d\x0a'

и

grep -P '\x0d\x0d'

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

Если, как и я, ваш минималистский 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

изменения, которые вы можете сделать, чтобы выше включают в себя:

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

например, что-то вроде этого может работать для вас с помощью od вместо свалка:

 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  

Comments

    Ничего не найдено.