2010-04-09 4 views
14

Qualcuno sa di uno strumento diff-like che può mostrarmi le modifiche tra due file di testo, ma ignora le modifiche negli spazi bianchi comprese le nuove righe?newline: ignora diff/diff su più righe/diff ignaro rif.

Ecco un esempio:

 
the quick brown fox jumped over the lazy bear. the quick brown fox 
jumped over the lazy bear. the quick brown fox jumped over the lazy 
bear. the quick brown fox jumped over the lazy bear. 
 
quick brown fox jumped over the lazy bear. the quick brown fox jumped 
over the lazy bear. the quick brown fox jumped over the lazy bear. 
the quick brown fox jumped over the lazy bear. 

Tutto quello che ho fatto è stato eliminare una parola e reflow, ma "diff -b" rileva un cambiamento su ogni linea (come dovrebbe, io non sono dicendo che questo è un bug in diff). Ma per i file LaTeX di grandi dimensioni questo è un grosso problema; cambia una parola in un lungo paragrafo e il diff che torni è praticamente inutile.

A proposito, sono consapevole del fatto che questo richiede molto più potere computazionale rispetto alle solite linee-sono-diff diff. Lo faccio solo su piccoli file generati dall'uomo e sono felice di aspettare a lungo se necessario.

risposta

11

wdiff allineamento parola per parola.

Per un display di facile lettura in un terminale, eseguire

wdiff -al <file1> <file2> | less 

Questo mostrerà (almeno sul mio sistema) inserimenti in <file2> riportati in grassetto e le soppressioni da <file2> sottolineate.

+0

ATTENZIONE: wdiff potrebbe non essere disponibile su tutti i sistemi. Ma è una bella utility – DVK

+0

Urrà! Questo è esattamente quello che volevo. Ora devo solo aspettare l'overflow dello stack per farmi dichiarare questa risposta. – Adam

+0

Mentre wdiff è piuttosto interessante, in realtà sto facendo downvoting per due motivi: in primo luogo, wdiff non mostra i numeri di riga dei diff trovati (enorme inconveniente); in secondo luogo, poiché è orientato alle parole, non può ignorare le modifiche nello spazio bianco (cioè 'foreach (' vs 'foreach ('). Ho scritto uno script PHP per compensare il secondo problema, ma senza numeri di linea è un enorme sprecare tempo a cercare grep per trovare le differenze "interessanti" Speravo di dire qualcosa di carino su compare ++ ma non ho ancora avuto risposta da loro riguardo se hanno un .rpm – Jeff

1

Un'opzione è di farlo suddividendo l'intero file in parole. Non è il 100% lo stesso risultato in termini di conoscenza del contesto, ma molto sintonizzato sul tipo di cambiamento che ti interessa.

Esempio:

cat file1 | perl5.8 -e '{s/\s+/\n/g;}' > file1.split_words 
cat file2 | perl5.8 -e '{s/\s+/\n/g;}' > file2.split_words 
diff file1.split_words file2.split_words 

Si può fare ancora meglio se il testo ha properies speciali, per essere più precisi, il riflusso avviene solo entro i limiti di un paragrafo che è definita come 2 nuove linee di fila - semplicemente sostituisci tutti i newline singoli con spazi e esegui regolarmente i risultati su diff -w.