10
votes

diff pour les lignes simples

Tous les outils DIFF que j'ai trouvés ne comparent que de comparer la ligne par ligne au lieu de char. Y a-t-il une bibliothèque qui donne des détails sur des chaînes à ligne unique? Peut-être aussi une différence de pourcentage, bien que je suppose qu'il existe des fonctions séparées pour cela?


1 commentaires

N'est-ce pas un duplicata de Stackoverflow.com/questions/1721738/... ?


4 Réponses :


3
votes

Ce que vous pouvez essayer est de scinder les deux chaînes de caractère par caractère dans des lignes, puis vous pouvez utiliser DIFF à ce sujet. C'est un hack sale, mais au moins, il devrait fonctionner et est assez facile à mettre en œuvre.

alternativement, vous pouvez diviser la chaîne en une liste de caractères en Python et utiliser DIFFLIB. Vérifiez Référence Python DIFFLIB


3 commentaires

J'y ai pensé, et cela ressemble à la "meilleure" option jusqu'à présent. J'ai également envisagé de regarder dans les outils de diffusion de ligne et essayez de le faire traiter des caractères comme des lignes à la place ... mais je pensais vérifier d'abord.


Cela peut être fait facilement diff <(fichier CAT1 | TR "" "" \ n ") <(Cat Fil2 | TR" "" "\ n") Mais le problème est que la sortie est mal formatée. Beaucoup mieux pour faire WDiff File1 File2 Grâce à @Michael Williamson Réponse.


Voici une version de caractère par caractère diff <(CAT A1 | S /./ \ 0 \ N / 'g) <(Cat A2 | SED' S /./ \ 0 \ N / N / 'G )



4
votes

Je cherchais quelque chose de similaire récemment et je suis tombé sur WDIFF . Il fonctionne sur des mots, pas des caractères, mais est-ce proche de ce que vous recherchez?


4 commentaires

Bien, mais les espaces doivent aussi importer. Une languette remplacée par un espace serait une différence non ramassée par ceci (si elle est divisée par WhitSpace).


@LHF, est-il abandonné ou il n'y a tout simplement pas beaucoup à améliorer?


@Aleksandr, je vois maintenant que Wdiiff a été relancé peu de temps après que j'ai posté ce commentaire. Voir ftp.gnu.org/gnu/wdiff


@lhf, sympa! 16 ans sans développement et maintenant de retour dans le jeu.



5
votes

Cet algorithme diffsie mot-by-mot:

http://github.com/paulgb/simplediff

Disponible en Python et PHP. Il peut même cracher une sortie formatée HTML à l'aide des et tags.


3 commentaires

Bien, mais les espaces doivent aussi importer. Une languette remplacée par un espace serait une différence non ramassée par ceci.


Le code source semble assez simple. Vous pouvez facilement le changer pour scinder sur une chaîne vide au lieu de WhitSpace afin que vous puissiez différer le caractère par caractère.


En fait, celui-ci fonctionne génial, en passant directement les chaînes à diff () au lieu de StringDiff (). Fonctionne bien sur une base de char en caractères, car les chaînes sont des séquences de Python. Et la sortie de la fonction est facile à utiliser. Je me demande sur les frais généraux de la recherche de la plus grande sous-chaîne commune, lorsque chaque article n'est qu'un caractère ... bien que je puisse être mal compris le code ...



3
votes

Vous pouvez implémenter une simple algorithme d'aiguille-wunsch . Le pseudo code est disponible sur Wikipedia: http://en.wikipedia.org/ wiki / aiguille% E2% 80% 93Wunsch_algorithm


0 commentaires