it-swarm-ru.tech

Как вы ищете файлы, содержащие окончания строки 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'
108
Tim Abell

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

grep -IUr --color "^M"

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

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

Объяснение

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

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

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

grep -lUP '\r$'

может быть использован.

15
Linulin
# 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
yabt

Запрос был поиском ... У меня похожая проблема ... кто-то отправил смешанные окончания строк в систему управления версиями, так что теперь у нас есть куча файлов с 0x0d0x0d0x0a окончаниями строк. Обратите внимание, что

grep -P '\x0d\x0a'

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

grep -P '\x0d\x0d\x0a'

а также

grep -P '\x0d\x0d'

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

3
Peter Y

Вы можете использовать команду файла в Unix. Это дает вам кодировку символов файла вместе с разделителями строк.

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

Если, как и я, ваш минималистический 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, чтобы найти только файлы, которые вы хотите сканировать
  • измените команду dump на od или любую другую утилиту для создания дампа
  • убедитесь, что команда cut содержит начальный и конечный пробел, а также вывод шестнадцатеричных символов из утилиты dump
  • ограничьте вывод dump первыми 1000 символами или около того для эффективности

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

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