Как вам искать файлы, содержащие Дос конца строки (возврата каретки и перевода строки) с помощью команды grep в Linux?
Я хочу искать файлы, содержащие окончания строки dos с grep на Linux. Что-то вроде этого:
grep -IUr --color 'rn' .
выше, кажется, соответствует буквальному rn это не то, что нужно.
вывод этого будет передаваться через xargs в todos для преобразования crlf в lf, как это
grep -IUrl --color '^M' . | xargs -ifile fromdos 'file'
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 поддерживает - 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
запрос-поиск... У меня есть похожая проблема... кто-то представил смешанную строку окончания в контроль версий, так что теперь у нас есть куча файлов с
0x0d0x0d0x0aлиния окончаний. Обратите внимание, что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