Как найти / исправить файлы с окончаниями строки MIXED (0x0d 0x0d 0x0a)

Я знаю, что могу «вероятно» исправить их, используя «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 ).

 Alex15 мар. 2018 г., 14:14
grep -IUPrl "\x0d\x0d$"

Ответы на вопрос(2)

которые содержат смешанные окончания строк:

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\

-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
> /dev/null 2>&1 && echo "$fn contains multiple CR CR LFs" done

-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
 Kaleb Pederson23 сент. 2010 г., 08:33
Я отредактирую, чтобы уточнить.
 Peter Y23 сент. 2010 г., 02:33
К сожалению, это не очень хорошо подходит для вопроса о поиске файлов. Например, как использовать комбо cat + grep в контексте поиска типа, чтобы вывести список всех файлов в дереве с плохими окончаниями строк.
 Peter Y23 сент. 2010 г., 01:23
Спасибо, у меня были большие надежды, но ... несмотря на то, что файл имеет окончания строк 0x0d 0x0d 0x0a, кот показывает ^ M $ в конце строк, а не ^ M ^ M $ (Windows / cygwin). По сути, микс 0x0d 0x0d 0x0a, похоже, не работает для большинства шаблонов (sed, perl, grep и т. Д.), Которые были опубликованы на эту тему! - (
 Peter Y23 сент. 2010 г., 01:53
Извините, я неверно истолковал ваш ответ, основанный на платформе ... $ на самом деле из-за опции cat "-E", которая означает показ окончаний строк ... поэтому в DOS это означает, что комбо 0x0d0x0a - это $. ^ M - это «дополнительный» 0x0d. Так что это подходящий для моего случая подход, но шаблон grep просто '\ ^ M \ $14$#39;.
 MykennaC10 окт. 2011 г., 18:28
Поиск ^ M в выводе cat -A может привести к нахождению этих символов в самом текстовом файле, поэтому вы можете получить ложные срабатывания. Смотрите также эту тему:stackoverflow.com/questions/73833/...
 Peter Y23 сент. 2010 г., 01:32
Думаю, пришло время написать мою собственную программу! -P
 Peter Y07 дек. 2010 г., 00:34
В итоге я использовал gnuwin32 file.exesourceforge.net/project/shownotes.php?release_id=662480to определить тип (обратите внимание, что он хорошо обнаруживает / сообщает о разных концах строк, с которыми я имею дело, но не исправляет! -P), затем модифицированный файл flip.exe (поскольку он неправильно работает с «комбинированным DOS / MAC», который что я имею.
 Peter Y23 сент. 2010 г., 01:31
Хм, результат несмешанного (DOS) файла cat -A - это просто $ ... опять же, теперь мне нужно знать, соответствует ли это ожиданиям или еще одному варианту проблем, которые я вижу с другими программами ( Например, \ x0d \ x0a работает с egrep, чтобы найти строки, по какой-то причине \ x0d \ x0d не найдет никаких строк, поэтому программы воспринимают эти символы как особый случай, а не буквальный поиск всех символов в файл. Как я уже сказал, я хочу знать, что я в буквальном смысле соответствует 0x0d0x0d0x0a, прежде чем вносить какие-либо изменения.

Можно попробовать bbe (http://bbe-.sourceforge.net/):

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

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

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

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

Ваш ответ на вопрос