2008-09-16 11 views
94

Я хочу искать файлы, содержащие доводные строки end с grep в Linux. Что-то вроде этого:Как вы можете искать файлы, содержащие dos line endings (CRLF) с grep в Linux?

grep -IUr --color '\r\n' . 

выше, кажется, соответствует буквального rn, который не то, что желательно.

Выходной сигнал этого будет конвейер через xargs в несделанные, чтобы преобразовать CRLF Л.Ф. как этого

grep -IUrl --color '^M' . | xargs -ifile fromdos 'file' 
+0

Вы пробовали [dos2unix] (http://linux.die.net/man/1/dos2unix)? Он автоматически фиксирует окончания строки. – sblundy 2008-09-16 15:54:19

+0

Я не совсем уверен, но iirc существует разница между цитированием шаблона внутри «и». Afaik в шаблонах, заключенных в «escape-последовательности», интерпретируется как правильная строка, поэтому «\ r» будет эквивалентно «\\ r» и «\ r» не имеет эквивалента (по крайней мере, в этих обозначениях) с « – Anticom 2014-10-16 13:10:44

+0

Anticom: В этом случае вы правы, что разница между« и »не имеет значения; однако, как правило, они различаются, поскольку «окруженные строки слабые цитируются и« сильно цитируются ». Самое большое, что я использую, это то, что $ expansions или` `не расширяются в слабых кавычках. См. [bash-hackers on quoting ] (http://wiki.bash-hackers.org/syntax/quoting) для более. – bschlueter 2015-01-06 17:15:43

ответ

88

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

grep -IUr --color "^M" 

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

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

Объяснение

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

grep Возможно, это не тот инструмент, который вы хотите для этого. Он будет печатать строку для каждой соответствующей строки в каждом файле. Если вы не хотите, скажем, запустить todos 10 раз в файле с 10 строками, grep - это не лучший способ сделать это. Использование находки для запуска файла на каждый файл в дереве, то оглавлению через что «CRLF» получит вам одну строки для каждого файла, который имеет дос стиль окончаний линии:

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
14

Если ваша версия Grep поддерживает -P (--perl-регулярное выражение) вариант, то

grep -lUP '\r$' 

могут быть использованы.

6
# 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 
2

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

grep -P '\x0d\x0a' 

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

grep -P '\x0d\x0d\x0a' 

и

grep -P '\x0d\x0d' 

не находит строки, так что может быть что-то «другое» происходит внутри Grep , когда дело доходит до линии заканчивая шаблонами ... к сожалению для меня!

1

Если, как я, ваш минималистский 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$' 
1

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

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