агностический дифференциал на конце строки?

StackOverflow https://stackoverflow.com/questions/543779

  •  23-08-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

или

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

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

Другие советы

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

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

РЕДАКТИРОВАТЬ 2:Только что нашел что-то похожее на то, что вам нужно - Дифф'нпатч:

Diff'nPatch - это порт для Macintosh утилит GNU 'Diff', «Patch» и «CMP».Он позволяет сравнивать и найти различия между двумя файлами или папками, сопоставляйте два файла, генерируют различные форматы (нормальный, контекст, Unidiff и т. Д.), Применяйте исправления, сравните байт файлов по байту.Он может обрабатывать любой тип концов линии (Mac, Unix или Windows)

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

diff -cpt a.c b.c --strip-trailing-cr

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

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

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

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

PHPStorm был единственным программным обеспечением, в котором был инструмент сравнения, который «просто работал» — именно этого я ожидаю от программного обеспечения 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, может содержать это?Без наглядного примера это совершенно бесполезно.

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

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

Потому что все это провалилось:

 diff -d --strip-trailing-cr --ignore-all-space --from-file=rest.phtml test.phtml

...не удалось игнорировать символы .

 diff -wd --strip-trailing-cr --ignore-all-space --from-file=rest.phtml test.phtml

...не удалось игнорировать символы .

 diff -wd --suppress-common-lines --strip-trailing-cr --ignore-all-space --from-file=rest.phtml test.phtml

...не удалось игнорировать символы .

 diff -wd test.phtml rest.phtml --suppress-common-lines --strip-trailing-cr --ignore-all-space

...не удалось игнорировать символы .

 diff -awd test.phtml rest.phtml --suppress-common-lines --strip-trailing-cr --ignore-all-space

...не удалось игнорировать символы .

В этом отношении, если бы они были символами , это также не удалось бы при добавлении символов .

Где test.phtml ==

фу

бар

и rest.html ==

Фубар

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


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

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

...неудача!

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

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

diff -r -q dir1/ dir2/

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

3:Делай обычный дифференциал

К недостаткам относятся:

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

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

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/

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top