2009-02-12 2 views
19

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

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

ответ

8

Как сказал Джей, Diff'nPatch кажется тем, что вы ищете. В качестве альтернативы вы можете конвертировать все концы строк ваш «\ г» в «\ п» в одной команде, как это:

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

или

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

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

+0

Если у него есть файлы с окнами style \ r \ n, то это приведет к замене каждого разрыва строки Windows на \ n \ n, что, вероятно, не является желаемым эффектом. – Jay

+0

Правда, но я принимал во внимание, что он упомянул только о концах строк в стиле mac и unix ... – UncleZeiv

+1

нет, это все маки, и у меня уже был mac2unix, который был очень похож (использует tr вместо sed, но да .. .) –

11

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

EDIT: только что понял, что я неправильно прочитал сообщение в первый раз, и вы действительно ищете diff, который будет работать с концами строк \r. Мое предложение состояло в том, чтобы конвертировать файлы с чем-то вроде flip, которые могут конвертировать файлы в стандартный формат \n.

EDIT 2: Просто найти что-то, что выглядит как то, что вы хотите - Diff'nPatch:

Diff'nPatch является порт для Macintosh из 'дифф' ГНУ, 'заплатку' и «CMP ' Утилиты. Он позволяет сравнивать и найти различия между двумя файлами или папок, сопоставить два файла, сгенерировать diff в различных форматах (обычный, контекст, unidiff и т. Д.), Применять исправления, сравнивать файлы по байтам. Он может обрабатывать любой тип линии окончаний (макинтош, Unix или Windows)

+0

nope. -w просто игнорирует пробелы в строке. Затем он обрабатывает файл \ r как одну огромную линию без \ r. \ n файл по-прежнему представляет собой набор разных строк. –

+0

кажется, что ссылка для Diff'nPatch теперь http://download.cnet.com/Diff-npatch/3000-2247_4-36909.html – yanjost

+5

Для файлов Unix и Dos, -w творит чудеса. Благодаря! – Chris

1

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

+0

hm, но mac ('\ r') не является dos ('\ r \ n') и unix ('\ n') ... – UncleZeiv

+0

Существует некоторая поддержка файлов в формате mac в формате dos2unix через параметр convmode. Имея это в виду, может быть возможно создать последовательное (и отдельное) преобразование с целью отличия/grepping. – Rog

+0

Я на самом деле написал mac2unix некоторое время назад, и это закончилось тем, что было bestsolution ... –

0

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

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

diff -r -q dir1/ dir2/ 

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

: Есть ли регулярные диф

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

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

Лучше автоматизировать шаг 2 с dos2unix или перевернуть или что-то –

6

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

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

Это не сработает. – CommaToast

+0

Параметры доступны также в Linux. – kenorb

+1

он разделит cr на OUT OUT OUT, а не на вход. –

-1

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

diff -r --ignore-all-space dir1/ dir2/ 

Я на OSX, и перепутали файлы из OSX и окон. Кредит: просмотр различий http://www.codealpha.net/514/diff-and-ignoring-spaces-and-end-of-lines-unix-dos-eol/

+0

Это не работает. Если файл A содержит «foo \ rbar», а файл B содержит «foobar», они будут отображаться как разные. Дело в том, чтобы * игнорировать все пробелы, включая возврат каретки! * – CommaToast

+0

Я думаю, что это неправильно. Если у вас есть два файла с 'foo bar' и' foobar', не могли бы вы сказать, что они разные? –

+0

Вы правы, в этом контексте это другое. Я действительно пришел на эту страницу из-за поиска способа игнорировать новые строки, когда их добавление является единственным изменением файла, так что, например, префессиональный JSON не будет рассматриваться как отличный, чем неконфиденциальная форма того же JSON. Конечно, с чем-то вроде YAML, где нет «непримиримой» формы, символы новой строки имеют жизненно важное значение. Я должен был прочитать его более внимательно, прежде чем комментировать ... слишком много вкладок ... – CommaToast

2

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

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

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

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

-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» или просто «из» файла?Что такое «похоже»? Что означает «есть» в предложении, «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

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


* 1,2 **! foo! bar \ No newline в конце файла

--- 1 ----! foobar \ No newline в конце файла

... сбой!

+0

RE - это регулярное выражение. –

Смежные вопросы