Я хочу найти файлы, содержащие окончания строки dos, с помощью grep в Linux. Что-то вроде этого:
grep -IUr --color '\r\n' .
Вышеупомянутое, похоже, соответствует буквальному, rn
а это не то, что нужно .
Результат будет передан через xargs в задачи для преобразования crlf в lf, как это
grep -IUrl --color '^M' . | xargs -ifile fromdos 'file'
dos2unix
с-ic
переключателем. Файлы LF можно искать с помощью unix2dos-ic
. Он не изменяет файлы. Только отчет.cat -v somefile.txt
; они появляются как^M
Ответы:
Используйте Ctrl+ V, Ctrl+, Mчтобы ввести буквальный символ возврата каретки в строку grep. Так:
будет работать - если
^M
есть буквальный CR, который вы вводите, как я предлагал.Если вам нужен список файлов, вы также хотите добавить эту
-l
опцию.объяснение
-I
игнорировать двоичные файлы-U
предотвращает удаление символов CR с помощью grep. По умолчанию он сделает это, если решит, что это текстовый файл.-r
рекурсивно читать все файлы в каждом каталоге.источник
printf '\r'
grep $(printf '\r')
. Но для большинства практических применений, связанных с bash, я бы придерживался$'\r'
.-U
актуальна только для Windows (или cygwin), но там она критична. В Windows без него команда работать не будет.-I
? По мануалу мне кажется, что бинарные файлы считаются несоответствующими. Разве комбинация-I
и-U
(обеспечивающая двоичный тип) не должна приводить к тому, что все файлы считаются несовпадающими?grep, вероятно, не тот инструмент, который вам нужен для этого. Он будет печатать строку для каждой совпадающей строки в каждом файле. Если вы, скажем, не хотите запускать задачи 10 раз в файле из 10 строк, grep - не лучший способ сделать это. Используя команду find для запуска файла для каждого файла в дереве, затем поиск по нему для "CRLF" даст вам одну строку вывода для каждого файла, который имеет окончание строки стиля dos:
даст вам что-то вроде:
источник
grep -IUrl --color '^M' . | xargs -ifile fromdos 'file'
file
программы. Это очень хрупко. Для (только одного) примера: он не работает с файлами XML,file
отчетамиXML document text
независимо от типа новой строки.-m /dev/null
на моемfind (GNU findutils) 4.4.2
(Ubuntu 12.04) эта опция кажется строчной .find . -type f | xargs file | grep CRLF
объясняетhell.com - grep -IUlr
источник
Если ваша версия grep поддерживает параметр -P (--perl-regexp) , тогда
может быть использован.
источник
источник
Запрос был поиском ... У меня аналогичная проблема ... кто-то отправил смешанные окончания строк в систему контроля версий, так что теперь у нас есть куча файлов с
0x0d
0x0d
0x0a
окончаниями строк. Обратите внимание, чтонаходит все строки, тогда как
и
не находит строк, поэтому может быть что-то "еще" происходит внутри grep, когда дело доходит до шаблонов окончания строк ... к сожалению для меня!
источник
Вы можете использовать команду file в unix. Он дает вам кодировку символов файла вместе с признаками конца строки.
источник
Если, как и я, ваш минималистичный unix не содержит таких тонкостей, как команда file , а обратная косая черта в ваших выражениях grep просто не работает, попробуйте следующее:
Вы можете захотеть внести следующие изменения:
Например, что-то вроде этого может сработать для вас, используя od вместо dump :
источник
dos2unix
имеет параметр информации о файле, который можно использовать для отображения файлов, которые будут преобразованы:Чтобы сделать это рекурсивно вы можете использовать
bash
«sglobstar
варианта, который для текущей оболочки включен сshopt -s globstar
:В качестве альтернативы вы можете использовать
find
для этого:источник