Как вы выполняете поиск файлов, содержащих окончания строк dos (CRLF), с помощью grep в Linux?
Вопрос
Я хочу выполнить поиск файлов, содержащих окончания строк 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 -IUlr $'\r'
Если ваша версия 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