Линия-конец агностической разницы?
Я работаю на Mac, с некоторыми довольно старыми файлами. Разные файлы были созданы разными программами, поэтому некоторые из них заканчиваются на \r (Mac), а некоторые-на \n (Unix). Я хочу иметь возможность запускать команды, такие как diff, grep и т. д. в этих файлах, но те, которые имеют \r, рассматриваются как одна гигантская строка. Существует ли версия diff, grep и т. д. что будет правильно работать со всеми новыми линиями?
ETA: я также хотел бы, чтобы это были утилиты Unix, поэтому я могу использовать их в скриптах, Emacs и т. д...
Ответы - Линия-конец агностической разницы? / Line-end agnostic diff?

13.02.2009 01:33:17
Если вы используете diff -w
, он будет игнорировать пробелы в файлах, что, вероятно, достаточно для ваших нужд.
EDIT: просто понял, что я неправильно прочитал сообщение в первый раз, и вы на самом деле ищете разницу, которая будет работать с \r
строк. Мое предложение состояло бы в том, чтобы конвертировать файлы с помощью чего-то вроде flip, который может конвертировать файлы в стандартный формат \n.
Правка 2: Только что нашел что-то похожее на то, что вы хотите-Diff'npatch:
Diff'npatch-это порт для Macintosh из GNU 'diff', 'patch' и 'cmp' коммунальные услуги. Это позволяет сравнивать и найти различия между двумя файлами или папки, сортировать файлы, создавать диффы в различных форматах (нормальные, контекст, unidiff и т.д.), применять патчи, сравнение файлов байт за байтом. Он может обрабатывать любой тип окончаний линий (mac, unix или windows)



diff
отмечал каждую отдельную строку файла как разницу. Я сравнил DOS / * X файлы. diff -uw
был лекарством.


13.02.2009 02:13:37
Команда dos2unix может быть полезна для преобразования ваших файлов в согласованный формат в первую очередь. Я считаю, что он доступен практически для каждой платформы, которую вы можете придумать, и может работать на множестве файлов одновременно. Я думаю, что есть пакет, доступный для mac.




13.02.2009 02:44:38
Как сказал Джей, Diff'npatch кажется тем, что вы ищете. Кроме того, вы можете преобразовать все ваши окончания строки '\r ' в '\n ' в одной команде, как это:
sed -ie 's/\r/\n/' filename
или
find . | xargs -n1 sed -ie 's/\r/\n/'
(В последнем случае вы можете каким-то образом отфильтровать список файлов, или он будет применен ко всем файлам во всех подкаталогах.)




sed -ie 's/\r/\n/g' filename
давал желаемые результаты, тогда sed -ie 's/\r/\n/' filename
вставлял возврат после каждой строки. Я не уверен, что значение этого дополнительного персонажа является, но это сработало для меня.

22.11.2010 02:19:09
Я использовал следующее быстрое исправление, которое имеет недостатки (см. ниже):
1: Сделайте различие и перечислите только имена файлов
diff -r -q dir1/ dir2/
2: Откройте и сохраните все перечисленные файлы с помощью редактора, который был использован, это изменит окончания строк.
3: делаем обычный дифф
Недостатки включают в себя:
- менее надежен, подвержен ошибкам
- больше работы, если у вас много файлов



06.02.2014 08:36:54
Это сработало для меня.:
diff -r --ignore-all-space dir1/ dir2/
Я на OSX, и у меня есть смешанные файлы из OSX и windows. Кредит: http://www.codealpha.net/514/diff-and-ignoring-spaces-and-end-of-lines-unix-dos-eol/


foo<new line>bar
и foobar
, не скажете ли вы, что это разные файлы?


04.03.2014 01:34:31
В представлении PHPStorm diff "игнорировать пробелы" просто работает . Он автоматически игнорирует различия в возврате каретки / EOL / новой строке / what-have-you. Вы можете тратить свое время, играя с тайными командами unix или что-то еще, или вы можете просто получить что-то, что действительно работает и двигаться вперед с жизнью.
- Использование любого из вышеупомянутых решений не удалось на Mountain Lion (включая тот, который отмечен как правильный ответ). Все ссылки на скачивание для "Diff-npatch" не удалось найти. (Я нашел http://webperso.easyconnect.fr/bdesgraupes/tools.html но я действительно не нравится идея прибегать к помощи команды diff инструмент, который не может быть вызван из командной строки и, следовательно, интегрируется с любой IDE или венчурные средства я мог бы использовать, как BBEdit, Конечно, или SmartSVN-все из которых, кстати, не игнорировать переводы строк с их встроенный инструмент просмотра различий.
Да, мои новые строки-это \r, но что с того? Аррр! Если программное обеспечение слишком глупо, чтобы понять, что \r == \n, то я просто буду использовать другое программное обеспечение, которое достаточно умно.
PHPStorm был единственным программным обеспечением, которое имело инструмент diff, который "просто работал" - именно это я ожидаю от программного обеспечения Mac. Я ожидаю, что программное обеспечение Mac будет просто работать . Я использую Mac, так что я могу делать свою работу вместо того, чтобы учиться магии терминальных команд на каждом шагу, которые почти все плохо документированы, ждет вас, чтобы просто понять, как команды должен быть отформатирован, без каких-либо четких примеров, так что вы никогда не знаете, если вы делаете это неправильно, или если команда просто не работает, как и все остальные вредные программы. Возьмите этот пример из "man diff":
-I RE --ignore-matching-lines=RE Ignore changes whose lines all match RE.
Итак, прочитав это, я понятия не имею, что это значит. Нет ни одного примера его использования. Что такое "ре"? Там ничего не сказано.
А еще есть этот драгоценный камень.:
--GTYPE-group-format=GFMT Similar, but format GTYPE input groups with GFMT. --line-format=LFMT Similar, but format all input lines with LFMT. --LTYPE-line-format=LFMT Similar, but format LTYPE input lines with LFMT. LTYPE is `old', `new', or `unchanged'. GTYPE is LTYPE or `changed'. GFMT may contain: %< lines from FILE1 %> lines from FILE2 %= lines common to FILE1 and FILE2 %[-][WIDTH][.[PREC]]{doxX}LETTER printf-style spec for LETTER LETTERs are as follows for new group, lower case for old group: F first line number L last line number N number of lines = L-F+1 E F-1 M L+1 LFMT may contain: %L contents of line %l contents of line, excluding any trailing newline %[-][WIDTH][.[PREC]]{doxX}n printf-style spec for input line number Either GFMT or LFMT may contain: %% % %c'C' the single character C %c'\OOO' the character with octal code OOO
Я не мог найти никакого смысла в этом отрывке. Что такое "вход"? Это оба файла или только файл "кому" или только файл "от"? Что означает "подобное"? Что значит "есть" означает в предложении "GFMT" есть "ltype равными или `измененные'"? Означает ли это "может быть заменено на"? Если это так, то почему не "GFMT"в кавычках или скобках и т. д.? Поскольку не приводится никакого примера, нет никакого способа узнать; формулировка документации совершенно двусмысленна. Что означает "GFMT может содержать"... значит? Означает ли "содержит", что текст, заменяющий аббревиатуру GFMT, может содержать это? Без ясного примера это совершенно бесполезно.
Зачем вообще писать man-страницу, если вы собираетесь сделать ее настолько загадочной и двусмысленной, что она бесполезна для тех, кто еще не знает, как использовать программное обеспечение? На данный момент это не руководство, а просто краткая справочная страница для тех, кто написал программное обеспечение, чтобы они могли вспомнить, как его использовать. Я думаю, они предполагают, что вы просто прочтете сам исходный код, если хотите знать, что он на самом деле делает.
Мое время дорого стоит. Я бы предпочел просто заплатить деньги, чтобы иметь программное обеспечение, которое действительно работает правильно и имеет надлежащую документацию.
Потому что все они провалились:
diff -d --strip-trailing-cr --ignore-all-space --from-file=rest.phtml test.phtml
...не удалось игнорировать символы \R.
diff -wd --strip-trailing-cr --ignore-all-space --from-file=rest.phtml test.phtml
...не удалось игнорировать символы \R.
diff -wd --suppress-common-lines --strip-trailing-cr --ignore-all-space --from-file=rest.phtml test.phtml
...не удалось игнорировать символы \R.
diff -wd test.phtml rest.phtml --suppress-common-lines --strip-trailing-cr --ignore-all-space
...не удалось игнорировать символы \R.
diff -awd test.phtml rest.phtml --suppress-common-lines --strip-trailing-cr --ignore-all-space
...не удалось игнорировать символы \R.
Если это были символы \n, то при добавлении символов \n также произошел сбой.
Где тест.phtml ==
foo
бар
и отдыхай.формат HTML ==
фрагментик
Команда "diff" всегда дает вам что-то вроде:
* 1,2**! фу ! bar \ нет новой строки в конце файла
--- 1 ---- ! foobar \ нет новой строки в конце файла
... провалиться!
