Question

Je travaille sur un Mac, avec certains fichiers assez vieux. différents fichiers ont été créés par des programmes différents, de sorte que certains d'entre eux se terminent par \ r (Mac) et d'autres avec \ n (unix). Je veux être en mesure d'exécuter des commandes comme diff, grep, etc sur ces fichiers, mais ceux qui ont \ r sont comme une ligne géante. personne ne sait d'une version de diff, grep, etc qui fonctionnent correctement avec toutes les nouvelles lignes?

ETA: Je voudrais aussi les aime être utilitaires unix pour que je puisse les utiliser dans les scripts, emacs, etc ...

Était-ce utile?

La solution

Comme Jay a dit, semble Diff'nPatch ce que vous recherchez. Sinon, vous pouvez convertir tous vos fin de ligne « \ r » dans « \ n » en une seule commande comme ceci:

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

ou

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

(Vous pouvez filtrer la liste des fichiers d'une certaine manière dans ce dernier cas ou il sera appliqué à tous les fichiers dans tous les sous-répertoires).

Autres conseils

Si vous utilisez diff -w il ignorera les espaces dans les fichiers, ce qui est probablement suffisant pour vos besoins.

EDIT : vient de réaliser j'ai mal lu le message la première fois et vous êtes à la recherche en fait un diff qui fonctionnera avec des fins de ligne \r. Ma suggestion serait de convertir les fichiers avec quelque chose comme Renverser qui peut convertir les fichiers dans un format standard \n.

EDIT 2 : Je viens de trouver quelque chose qui ressemble à ce que vous voulez -

L'utilitaire diff livré avec Mac OS X Lion a une option « bande arrière-cr » qui fait que vous voulez. Vous pouvez l'utiliser comme ceci:

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

La commande dos2unix pourrait être utile pour convertir vos fichiers dans un format cohérent en premier. Je crois qu'il est disponible pour à peu près toutes les plateformes que vous pouvez penser et peut fonctionner sur des lots de fichiers à la fois. Je crois qu'il ya un paquet disponible pour mac.

PHPStorm point de vue diff de "ignorer les espaces blancs" juste fonctionne . Il ne tient pas compte automatiquement des différences dans le retour chariot / EOL / saut de ligne / ce que vous voudrez. Vous pouvez perdre votre temps à tripoter les commandes unix Arcane ou autre, ou vous pouvez simplement obtenir quelque chose qui fonctionne réellement et aller de l'avant avec la vie.

Oui, mes sauts de ligne sont \ r, mais quoi? Arrr! Si le logiciel est trop stupide pour se rendre compte que \ r == \ n alors je vais juste utiliser un autre logiciel que assez intelligent.

PHPStorm était le seul logiciel qui avait un outil de comparaison qui « juste travaillé » - ce qui est ce que je pense logiciel Mac à faire. Je pense logiciel Mac travailler simplement . J'utilise un Mac pour que je puisse faire mon travail au lieu d'apprendre les commandes du terminal Arcane à chaque tour, qui sont presque tous mal documentés, vous attend à comprendre à quel point les commandes sont censées être formatées sans exemples clairs, de sorte que vous ne savez jamais si vous le faites mal ou si la commande ne fonctionne tout simplement pas comme tous les autres mauvais logiciels. Prenez cet exemple de "l'homme diff":

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

OK, donc avoir lu cela, je ne sais pas ce que cela signifie. Il n'y a pas d'exemple de son utilisation. Qu'est-ce que « RE »? Il ne dit nulle part.

Ensuite, il y a ce bijou:

  --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

Je ne pouvais faire aucun sens de ce passage. Quelle est la « entrée »? Est-ce les deux fichiers ou tout simplement le « à » fichier ou tout simplement le « de » fichier? Ce qui est « similaire » se référant à? Que signifie « est » signifie dans la phrase, "GFMT « est » ou` LTYPE changé »? Est-ce que cela signifie « peut être remplacé par »? Si oui, alors pourquoi n'est pas « GFMT » dans les citations ou des crochets etc.? Puisqu'aucun exemple est donné, il n'y a aucun moyen de savoir; Le libellé de la documentation est tout à fait ambiguë. Que signifie « GFMT peut contenir » ... signifie? Ne « contiennent » signifie que le texte remplaçant le GFMT acronyme peut contenir que? Sans un exemple clair, il est tout à fait inutile.

Pourquoi même pas la peine d'écrire une page de manuel si vous allez faire c'est tellement cryptique et ambigu inutile à toute personne qui ne sait pas encore comment utiliser le logiciel, essentiellement? À ce moment-là, ce n'est pas un manuel; il est juste une page de référence rapide pour les gars qui ont écrit le logiciel afin qu'ils puissent se rappeler comment l'utiliser. Je suppose qu'ils supposent que vous venez de lire lui-même le code source si vous voulez savoir ce qu'il fait.

Mon temps est précieux. Je préfère simplement payer l'argent pour avoir un logiciel qui fonctionne réellement correctement et a une documentation appropriée.

Parce que ces tous échoué:

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

... pas ignorer \ r caractères.

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

... pas ignorer \ r caractères.

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

... pas ignorer \ r caractères.

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

... pas ignorer \ r caractères.

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

... pas ignorer \ r caractères.

Pour cette question si elles étaient \ n caractères il a également échoué lorsque les caractères \ n sont ajoutés.

Où test.phtml ==

  

foo

     

bar

et rest.html ==

  

foobar

La commande "diff" vous donne toujours quelque chose comme:

  
     

* 1,2 ** ! foo! bar \ Pas NEWLine à la fin du fichier

     

--- 1 ----! foobar \ Aucune nouvelle ligne à la fin du fichier

... échouer!

J'utilisé la solution rapide suivante qui présente des inconvénients (voir ci-dessous):

1 : Effectuez une diff et liste que les noms de fichier

diff -r -q dir1/ dir2/

2 :. Ouvrir et enregistrer tous les fichiers listés avec l'éditeur qui a été utilisé, cela va changer les fins de ligne

3 : Effectuez une diff régulière

Les inconvénients comprennent:

  • moins robuste, sujette aux erreurs
  • plus de travail si vous avez beaucoup de fichiers

Cela a fonctionné pour moi:

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

Je suis sur Mac OS X, et ont des fichiers mélangés à partir de Mac OS X et Windows. Crédit: http: //www.codealpha.net/514/diff-and-ignoring-spaces-and-end-of-lines-unix-dos-eol/

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top