de fin de ligne agnostique diff?
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 ...
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.
- En utilisant l'une des solutions mentionnées ci-dessus a échoué sur Mountain Lion (y compris celui marqué comme la bonne réponse). Tous les liens de téléchargement pour « Diff-npatch » a échoué. (J'ai trouvé http://webperso.easyconnect.fr/bdesgraupes/tools.html mais je n'aime vraiment pas l'idée d'avoir à recourir à l'aide d'un outil de comparaison qui ne peut être invoqué à partir de la ligne de commande et donc intégré avec tout IDE ou un outil VCS je pourrais être en utilisant, comme BBEdit, sources du ou SmartSVN - tous dont, d'ailleurs, pas ignorer avec leur retour à la ligne outil de diff intégré.
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/