Линия-конец агностической разницы?

Линия-конец агностической разницы?

13.02.2009 01:30:32 Просмотров 18 Источник

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

ETA: я также хотел бы, чтобы это были утилиты Unix, поэтому я могу использовать их в скриптах, Emacs и т. д...

У вопроса есть решение - Посмотреть?

Ответы - Линия-конец агностической разницы? / Line-end agnostic diff?

Jay

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)

https://stackoverflow.com/questions/543779/line-end-agnostic-diff/543796#comment355742_543796
нет. - w просто игнорирует пробелы в строке. затем он обрабатывает файл \r как одну огромную строку, без \R. файл \n по-прежнему представляет собой кучу разных строк.
https://stackoverflow.com/questions/543779/line-end-agnostic-diff/543796#comment4543911_543796
похоже, что ссылка на Diff'npatch теперь есть download.cnet.com/Diff-npatch/3000-2247_4-36909.html
https://stackoverflow.com/questions/543779/line-end-agnostic-diff/543796#comment31034073_543796
Я согласен с Крисом: я только что нашел ответ Джея. У меня также была проблема с различными окончаниями строк, в результате чего diffотмечал каждую отдельную строку файла как разницу. Я сравнил DOS / * X файлы. diff -uwбыл лекарством.
https://stackoverflow.com/questions/543779/line-end-agnostic-diff/543796#comment66857304_543796
Для многих других программ символ новой строки также является символом пробела, но diff-это программа, ориентированная на строку, и символ новой строки всегда заканчивается строкой. Следовательно, параметр-w или -- ignore-all-space не игнорирует изменения, связанные с новой строкой; он игнорирует только другие изменения пробела.
Rog

13.02.2009 02:13:37

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

https://stackoverflow.com/questions/543779/line-end-agnostic-diff/543956#comment356142_543956
Существует некоторая поддержка Mac-файлов в dos2unix с помощью опции convmode. С учетом этого, возможно, удастся создать последовательное (и отдельное) преобразование для целей диффинга / грэппинга.
https://stackoverflow.com/questions/543779/line-end-agnostic-diff/543956#comment358103_543956
Я действительно написал mac2unix некоторое время назад, и это оказалось лучшим решением...
https://stackoverflow.com/questions/543779/line-end-agnostic-diff/543956#comment358167_543956
кроме того, есть команда "флип", которая работает для любой комбинации! Учитесь чему-то новому каждый день!
Является ответом!
UncleZeiv

13.02.2009 02:44:38

Как сказал Джей, Diff'npatch кажется тем, что вы ищете. Кроме того, вы можете преобразовать все ваши окончания строки '\r ' в '\n ' в одной команде, как это:

sed -ie 's/\r/\n/' filename

или

find . | xargs -n1 sed -ie 's/\r/\n/'

(В последнем случае вы можете каким-то образом отфильтровать список файлов, или он будет применен ко всем файлам во всех подкаталогах.)

https://stackoverflow.com/questions/543779/line-end-agnostic-diff/544076#comment356180_544076
Если у него есть какие-либо файлы с Windows style \r\n, то это приведет к замене каждого разрыва строки Windows на \n\n, что, вероятно, не является желаемым эффектом.
https://stackoverflow.com/questions/543779/line-end-agnostic-diff/544076#comment357152_544076
Верно, но я принимал во внимание, что он упоминал только окончания строк в стиле mac и unix...
https://stackoverflow.com/questions/543779/line-end-agnostic-diff/544076#comment358108_544076
нет, это все macs, и у меня уже был mac2unix, который был очень похож (использует tr вместо sed, Но да...)
https://stackoverflow.com/questions/543779/line-end-agnostic-diff/544076#comment58158638_544076
Сознательно это старый пост, но. Я должен был " г " к вашей первой команде, как я обнаружил, что дополнительный возврат был реализован. т. е. sed -ie 's/\r/\n/g' filenameдавал желаемые результаты, тогда sed -ie 's/\r/\n/' filenameвставлял возврат после каждой строки. Я не уверен, что значение этого дополнительного персонажа является, но это сработало для меня.
Niels Bom

22.11.2010 02:19:09

Я использовал следующее быстрое исправление, которое имеет недостатки (см. ниже):

1: Сделайте различие и перечислите только имена файлов

diff -r -q dir1/ dir2/

2: Откройте и сохраните все перечисленные файлы с помощью редактора, который был использован, это изменит окончания строк.

3: делаем обычный дифф

Недостатки включают в себя:

  • менее надежен, подвержен ошибкам
  • больше работы, если у вас много файлов
https://stackoverflow.com/questions/543779/line-end-agnostic-diff/4244861#comment41852440_4244861
Лучше автоматизировать Шаг 2 с помощью dos2unix или flip или еще чего-нибудь
Karra

10.10.2011 05:07:07

Утилита diff в комплекте с OSX Lion имеет опцию "strip-trailing-cr", которая делает то, что вы хотите. Вы используете его вот так:

diff -cpt a.c b.c --strip-trailing-cr
https://stackoverflow.com/questions/543779/line-end-agnostic-diff/7713213#comment42189060_7713213
Эти опции также доступны в Linux.
https://stackoverflow.com/questions/543779/line-end-agnostic-diff/7713213#comment60501306_7713213
это лишит cr на выходе diff, а не на входе.
Wisco crew

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/

https://stackoverflow.com/questions/543779/line-end-agnostic-diff/21608683#comment33626179_21608683
Это не работает. Если файл A содержит "foo\rbar", а файл B содержит" foobar", они будут выглядеть по-разному. Смысл в том, чтобы игнорировать все пробелы, включая возврат каретки!
https://stackoverflow.com/questions/543779/line-end-agnostic-diff/21608683#comment33663049_21608683
Я думаю, что это неправильно. Если у вас есть два файла с foo<new line>barи foobar, не скажете ли вы, что это разные файлы?
https://stackoverflow.com/questions/543779/line-end-agnostic-diff/21608683#comment33817158_21608683
Вы правы, в данном контексте все по-другому. Я на самом деле пришел на эту страницу из-за поиска способа игнорировать новые строки, когда их добавление является единственным изменением в файле, так что, например, prettified JSON не будет рассматриваться как отличная от не prettified форма того же JSON. Конечно, с чем-то вроде YAML, где нет "некрасивой" формы, тогда символы новой строки жизненно важны. Я должен был прочитать его более внимательно, прежде чем комментировать... слишком много вкладок...
CommaToast

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 \ нет новой строки в конце файла

... провалиться!

https://stackoverflow.com/questions/543779/line-end-agnostic-diff/22157931#comment41852402_22157931
RE-это регулярное выражение.
Закрыть X