разница в конце строки? - PullRequest
20 голосов
/ 13 февраля 2009

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

ETA: Я также хотел бы, чтобы они были утилитами Unix, чтобы я мог использовать их в скриптах, emacs и т. Д ...

Ответы [ 7 ]

11 голосов
/ 13 февраля 2009

Если вы используете <strong>diff -w</strong>, он игнорирует пробелы в файлах, что, вероятно, достаточно для ваших нужд.

РЕДАКТИРОВАТЬ : только что понял, что я неправильно прочитал пост в первый раз, и вы на самом деле ищете diff, который будет работать с \r окончаниями строк. Я предлагаю преобразовать файлы в что-то вроде flip , которое может конвертировать файлы в \n стандартный формат.

РЕДАКТИРОВАТЬ 2 : только что нашел что-то, что выглядит, как вы хотите - Diff'nPatch :

Diff'nPatch - это порт для Macintosh GNU 'diff', 'patch' и 'cmp' коммунальные услуги. Это позволяет сравнивать и найти различия между двумя файлами или папки, сопоставить два файла, генерировать различия в различных форматах (нормальный, контекст, унидифф и т. д.), применяются патчи, сравнивайте файлы побайтно. Может обрабатывать любые типы окончаний строк (Mac, Unix или Windows)

8 голосов
/ 13 февраля 2009

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

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

или

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

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

7 голосов
/ 10 октября 2011

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

diff -cpt a.c b.c --strip-trailing-cr
1 голос
/ 04 марта 2014

Представление diff в PHPStorm "игнорировать пробелы" просто работает . Он автоматически игнорирует различия в возврате каретки / EOL / newline / what-have-you. Вы можете тратить свое время на игры с тайными командами Unix или чем-то еще, или вы можете просто получить что-то, что действительно работает и двигаться вперед с жизнью.

  • Использование любого из вышеперечисленных решений на Mountain Lion не удалось (включая решение, помеченное как правильный ответ). Все ссылки для загрузки "Diff-npatch" не удалось. (Я нашел http://webperso.easyconnect.fr/bdesgraupes/tools.html, но мне действительно не нравится идея прибегать к использованию инструмента diff, который не может быть вызван из командной строки и таким образом интегрирован с любым инструментом IDE или VCS, который я мог бы использовать, как BBEdit, SourceTree или SmartSVN - и все они, BTW, не смогли игнорировать переводы строки с помощью встроенного инструмента сравнения.

Да, мои новые строки \ r, но что с того? Arrr! Если программное обеспечение слишком глупо, чтобы понять, что \ r == \ n, тогда я просто собираюсь использовать другое программное обеспечение, которое достаточно достаточно умное.

PHPStorm был единственным программным обеспечением, которое имело инструмент сравнения, который «только что работал» - именно этого я ожидаю от программного обеспечения Mac. Я ожидаю, что программное обеспечение Mac просто будет работать . Я использую Mac, так что я могу выполнять свою работу вместо изучения тайных команд терминала на каждом шагу, которые почти все плохо документированы, ожидая, что вы просто поймете, как команды должны быть отформатированы без каких-либо четких примеров, так что вы никогда не узнаете, вы делаете это неправильно или если команда просто не работает , как и все другие плохие программы. Возьмите этот пример из "man diff":

   -I RE  --ignore-matching-lines=RE
          Ignore changes whose lines all match RE.

Хорошо, прочитав это, я понятия не имею, что это значит. Там нет примера его использования. Что такое "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

Я не мог иметь никакого смысла в этом отрывке. Что такое «вход»? Это оба файла или просто файл "to" или просто файл "from"? Что означает «подобное»? Что означает «есть» в предложении, «GFMT» означает «LTYPE или« изменен »»? Означает ли это «может быть заменено»? Если так, то почему «GFMT» не в кавычках или скобках и т. Д.? Поскольку пример не приводится, нет способа узнать; формулировка документации совершенно неоднозначна. Что означает "GFMT может содержать" ... означает? Означает ли «содержать», что текст, заменяющий аббревиатуру GFMT, может содержать это? Без четкого примера это совершенно бесполезно.

Зачем вообще писать справочную страницу, если вы собираетесь сделать ее настолько загадочной и двусмысленной, что она бесполезна для тех, кто в принципе не знает, как использовать программное обеспечение? В этот момент это не руководство; Это просто краткая справочная страница для парней, которые написали программное обеспечение, чтобы они могли вспомнить, как его использовать. Я предполагаю, что они предполагают, что вы просто прочитаете сам исходный код, если хотите знать, что он на самом деле делает.

Мое время ценно. Я предпочел бы просто заплатить деньги, чтобы иметь программное обеспечение, которое действительно работает правильно и имеет надлежащую документацию.

Потому что все это не удалось:

 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 символов также не получалось.

Где test.phtml ==

Foo

бар

и rest.html ==

Foobar

Команда "diff" всегда дает вам что-то вроде:


* 1,2 **! фу! bar \ Нет новой строки в конце файла

--- 1 ----! foobar \ Нет новой строки в конце файла

... провал!

1 голос
/ 13 февраля 2009

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

0 голосов
/ 06 февраля 2014

Это сработало для меня:

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/

0 голосов
/ 22 ноября 2010

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

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

diff -r -q dir1/ dir2/

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

3 : сделать обычный diff

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

  • менее надежный, подверженный ошибкам
  • больше работы, если у вас много файлов
...