Как найти / исправить файлы с окончаниями строки MIXED (0x0d 0x0d 0x0a) - PullRequest
6 голосов
/ 23 сентября 2010

Я знаю, что могу «вероятно» исправить их, используя «flip -u» (cygwin flip), который в основном удаляет один из 0xd, оставляющий файл с окончанием строки в стиле DOS (0x0d 0x0a) (конечно, технически это может считаться ошибкой!).

Но другая сторона в том, что я хотел бы сделать это выборочно, гарантируя, что то, что я исправляю, действительно является «недвоичным» файлом и ЯВНО заменяет последовательность 0x0d 0x0d 0x0a на 0x0d 0x0a ... не запускается глючная программа, которая, кажется, делает то, что я хочу (и, возможно, больше).

Обратите внимание, что grep -P '\ x0d \ x0d \ x0a' и grep -P '\ x0d \ x0d' не находят эти строки.

Хотя люди говорят, что grep -P 'x0d \ x0a' правильно находит окончания строк, я должен предположить, что происходит что-то еще, поскольку он не может сопоставить другие шаблоны в файле со смешанными окончаниями строк ( 0x0d 0x0d 0x0a).

Ответы [ 2 ]

3 голосов
/ 23 сентября 2010

Вот простой способ определить файлы, которые содержат смешанные окончания строк:

cat -A $FILE | grep '\^M\^M\$'

-A подразумевает -v и -E, которые включают окончания строк и другие скрытые символы. Например, давайте создадим тестовый файл. Я буду использовать реальный текст, чтобы довольно точно представить окончания строк, которые вы увидите:

$ od -x test1.txt 
0000000 6464 2061 0d20 0a0d 6464 6161 2020 0d0d
0000020 0a0a 6164 2020 0a0d
0000030

Теперь посмотрим, что нам дает кошка:

$ cat -vE test1.txt
dda  ^M^M$
ddaa  ^M^M$
$
da  ^M$

cat действительно показывает нам CR и LF (хотя LF не отображаются на одной строке - и это оправданно), так что теперь мы можем их найти:

find /path -yourPredicatesOfInterest -print | while read fn ; do
    cat -A $fn | grep '\^M\^M\$' > /dev/null 2>&1 && echo "$fn contains multiple CR CR LFs"
done
0 голосов
/ 23 сентября 2010

Вы можете попробовать bbe (http://bbe -. Sourceforge.net/):

bbe -e 's/\x0d\x0d\x0a/\x0a/'

, который заменит окончание строки окончаниями строки unix; или:

bbe -e 's/\x0d\x0d\x0a/\x0d\x0a/'

, который заменит их на окончания строки DOS.

...