2013-10-06 7 views
7

Lo strumento diff standard è molto utile per trovare linee in un file che differiscono, ma non funziona bene per le differenze carattere per carattere. Ho spesso bisogno di unire testi carattere per carattere (cioè testo scritto, non codice) modificato senza sincronizzazione su computer diversi (sì, so che non dovrei, ma succede comunque). Oltre ad aggiungere un paragrafo o due, avrei potuto modificare una virgola, un errore di ortografia o qualche piccola modifica nel testo che era in precedenza comune a entrambi i file.Come si esegue un diff di carattere per lettura portatile, leggibile e pipettabile dalla riga di comando?

Diff mi dirà quali linee sono cambiate, ma poiché potrebbero esserci più diff per riga, devo scrutare attentamente le linee per trovare ogni differenza fisicamente piccola ma importante per linea. Dopo aver risolto, devo ripetere il diff per essere sicuro di non perdere nessuna modifica. Diventa ancora peggio quando le righe sono formattate in paragrafi (ad esempio una riga per paragrafo) e quando molte righe consecutive presentano differenze così piccole.

In questo momento devo ammettere che di solito carico solo entrambi i file in Microsoft Word e utilizzo la sua funzione di diff incorporata. Ovviamente è scomodo avviare un enorme pacchetto come Word solo per trovare alcune piccole differenze, ma almeno confronta i file in base ai caratteri per carattere.

Quello che voglio davvero è un modo Unix per farlo. Uno strumento o uno script piccolo e carino che esegue confronti carattere per carattere sul testo, ovvero non basato su linea, in grado di ignorare le terminazioni di riga, riportare da alcuni sensibili ascii-art e completamente pipeable per l'utilizzo negli script dal comando linea?

C'è un'altra domanda per questo, Using 'diff' (or anything else) to get character-level diff between text files, ma quella domanda è stata soddisfatta da una lib esemplificata da uno strumento basato sul Web, preferirei qualcosa sulla riga di comando.

+0

La stessa domanda menziona anche python [difflib] (http://docs.python.org/library/difflib .html) e un'interfaccia [riga di comando] (http://docs.python.org/library/difflib.html#a-command-line-interface-to-difflib). Lo hai provato? – devnull

+0

No, Non l'ho notato, lo esaminerò! Speravo ci fosse un pacchetto standard mantenuto per questo (cioè Duh! Tutti ma tu sai che dovresti usare: ...), ma sembra essere un problema più complicato – 00prometheus

+0

Puoi inserire ogni carattere nella sua linea e usare uno strumento di diff. –

risposta

4

Non sono sicuro che soddisfi i criteri della "riga di comando", ma io uso gvim/vim ogni giorno per questo scopo.

  1. Aprire i file che si desidera diff come questo:

    gvim -d file1 file2 
    
  2. rendere la finestra a tutto schermo in modo che sia più facile vedere

  3. Effettuare le split finestre all'interno gvim dimensioni uguali con il comando: C-w = (che è Control + W e quindi =)

  4. Per vedere paragrafo linee migliori formattati, inserire :set wrap, poi passare all'altra split-window con C-w w (o con il mouse-click) e anche lì entrare :set wrap

  5. per spostarsi tra le modifiche, utilizzare [c e ]c. Per unire le modifiche, utilizzare dp ("diff put") e do ("diff get/get").

linee con differenze sono evidenziate, e le differenze della linea sono anche evidenziati con un altro colore. Spero che questo faccia quello che ti serve. gvim può fare ancora di più per te, come la fusione da un file all'altro. Puoi saperne di più con il comando :help diff (all'interno di gvim).

È anche possibile provare kdiff3, potrebbe essere più semplice dell'apprendimento vim.

+0

Grazie Janos, non sapevo che Vim potesse farlo! È molto più rapido iniziare vim di Word, e la modalità vim -d fa tutto ciò che fa Word. Desidero ancora un puro strumento da riga di comando, in modo che io possa usarlo in pipe e così via, ma forse semplicemente non è uno strumento standard per quello che voglio. Mi dispiace di avere troppi punti per votare la tua risposta, ma forse qualcun altro potrebbe? – 00prometheus

0

Sembra che il più vicino che possiamo ottenere sia la risposta vimdiff di janos, sebbene non sia riga di comando.

Un'alternativa che è ben supportata, inclusa nelle principali distribuzioni (come Debian e anche Cygwin), da riga di comando e pipetta, oltre che in grado di ignorare le terminazioni di linea è wdiff. wdiff può essere usato molto allo stesso modo del diff standard. Sfortunatamente, non è basato sui caratteri, è basato sulla parola.

Per uso umano, wdiff è probabilmente abbastanza vicino; trovare una corrispondenza mancata di un singolo personaggio all'interno di una parola è semplice e veloce. Lo svantaggio principale è che non può essere utilizzato in programmi e script se lo scopo è trovare caratteri singoli.

C'è in realtà non sembra esistere alcun supportato diff basata carattere della riga di comando :-(.

Problemi correlati