In uno dei nostri tutorial precedenti, abbiamo discusso di un'utilità della riga di comando di Linux, denominata diff - che consente di confrontare due file riga per riga. Ma cosa succede se il requisito è confrontare non due, ma tre file? Sì, esiste anche un'utilità della riga di comando Linux per questo, ed è appropriatamente chiamata diff3 .
Se stavi cercando uno strumento del genere, non cercare oltre, poiché in questo tutorial spiegheremo l'uso di diff3 attraverso esempi di facile comprensione.
But before we move forward, we would like you to know that all the examples mentioned in this tutorial have been tested on Ubuntu 14.04 with bash version 4.3.11(1), and the version of diff3 that we've used is 3.3.
Installa diff3
Lo strumento diff3 sarà probabilmente installato per impostazione predefinita sul tuo sistema, almeno su Ubuntu lo è. Ma se non è così, non preoccuparti perché puoi farlo facilmente installando il pacchetto GNU Diffutils. Per istruzioni su come scaricare e installare il pacchetto sul tuo sistema, vai qui.
Utilizzo di Diff3
Poiché l'utilità diff3 confronta tre file, quindi per i nostri esempi di utilizzo dovremo prendere tre file che passeremo come input allo strumento.
Ecco il file1:
This is line1 with some change
This is line2
This is line3
Ecco il file2:
This is line1
This is line2
This is line3
Ed ecco il file3:
This is line1
This is line2
This is line3
Chiaramente, se vediamo il contenuto di questi tre file, l'unica modifica è nella prima riga del primo file. Quindi ora vediamo come diff3 segnala questa modifica.
Ecco come possiamo usare diff3 in questo caso:
diff3 file1 file2 file3
Ed ecco l'output che produce:
====1
1:1c
This is line1 with some change
2:1c
3:1c
This is line1
Puoi comprendere l'output nel modo seguente:
- La prima riga che inizia con quattro segni '=' e termina con il numero '1' dice che la modifica è nel primo file.
- Nella riga successiva, il primo '1' significa file1; '1c' dopo i due punti 'significa che la prima riga contiene'. La riga attuale viene visualizzata nella riga successiva dell'output.
- Allo stesso modo, 2:1c e 3:1c significano 'la prima riga di file2 e file3 contiene'. E poiché il contenuto della riga è lo stesso in entrambi i file, la riga effettiva viene visualizzata solo una volta, alla fine dell'output.
Per rendere le cose più chiare, prendiamo un altro caso in cui la modifica è in file3.
Ecco il file1:
This is line1
This is line2
This is line3
Ecco il file2:
This is line1
This is line2
This is line3
Ed ecco il file3:
This is line1 with some change
This is line2
This is line3
Il comando rimane lo stesso:
diff3 file1 file2 file3
Ed ecco l'output:
====3
1:1c
2:1c
This is line1
3:1c
This is line1 with some change
Quindi l'output in questo caso può essere compreso come:
- La modifica è nel file3
- Sia file1 che file2 contengono "Questa è la riga1" come prima riga
- Mentre il file3 contiene "Questa è la riga1 con alcune modifiche" come prima riga.
Era tutto su come i rapporti diff3 cambiano nelle righe. Ora vediamo come si comporta diff3 se uno dei file contiene una riga in più:
Mentre il file1 e il file2 rimangono gli stessi, ecco il file3:
This is line1
This is line2
This is line3
This is line4
Come chiaro dal suo contenuto, file3 ora contiene una riga in più alla fine.
Eseguiamo lo stesso comando diff3:
diff3 file1 file2 file3
Ed ecco l'output prodotto dal comando:
====3
1:3a
2:3a
3:4c
This is line4
L'output inizia dicendo che la modifica è nel file3. La modifica è nella quarta riga di file3 (3:4c), che è una riga completamente nuova rispetto a file1 e file2.
Ciò di cui abbiamo discusso finora sono stati alcuni casi semplici. Prendiamo un paio di situazioni leggermente complesse. Ad esempio, considera file1, file2 e file3 come contenenti quanto segue:
This is line1
This is line2 with some change
This is line3
This is line1
This is line2
This is line3
This is line1
This is line2
This is line3 with some change
Quindi ora sia file1 che file2 contengono modifiche e anche quello in righe diverse. Vediamo cosa produce diff3 in questo caso:
====
1:2,3c
This is line2 with some change
This is line3
2:2,3c
This is line2
This is line3
3:2,3c
This is line2
This is line3 with some change
Come puoi vedere nell'output mostrato sopra, la prima riga non contiene alcun numero. Questo perché non uno, ma più file ora contengono modifiche. Per diff3, le righe 2 e 3 di tutti e tre i file ora sono diverse. Questo è il motivo per cui invece di un singolo numero dopo i due punti (:), l'output ora contiene un intervallo - '2,3', che significa dalla riga 2 alla riga 3.
Facciamo un altro esempio. Supponiamo che questa volta i tre file contengano le seguenti informazioni:
This is line1
This is line2
This is line3
This is line4
This is line1
This is line2
This is line3
This is line1
This is line2
This is line3
This is line4
This is line5
Ora, quando viene eseguito il comando diff, produce il seguente output:
====
1:4c
This is line4
2:3a
3:4,5c
This is line4
This is line5
Qui, se provi a capire, il comando diff3 dice che le modifiche sono successive alla riga 3 in tutti e tre i file. Mentre file1 contiene la riga "This is line4" come quarta riga, file3 contiene "This is line4" e "This is line5" rispettivamente come quarta e quinta riga. Il file2, invece, ha solo 3 righe.
Quindi era tutto sul lavoro di base su diff3. Per quel che vale, ecco cosa dice la documentazione ufficiale sullo strumento:"Puoi usare il diff3
comando per mostrare le differenze tra tre file. Quando due persone hanno apportato modifiche indipendenti a un originale comune, diff3
può segnalare le differenze tra l'originale e le due versioni modificate e può produrre un file unito che contiene le modifiche di entrambe le persone insieme ad avvisi sui conflitti.".
Conclusione
Abbiamo appena scalfito la superficie qui, Diff3 è in grado di fare molto di più. Ad esempio, come sottolinea anche la documentazione ufficiale, puoi usarlo anche per unire le modifiche. Inoltre ci sono molte opzioni della riga di comando che ti consentono di personalizzare l'output del comando e di accedere ad alcune altre funzionalità che offre. È tutto lì nella pagina man, esaminalo.