Как искать файлы, содержащие доводные строки 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
Ответ 3
grep -IUlr $'\r'
explainhell.com - grep -IUlr
Ответ 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