Furor Teutonicus blog | over | volg | teuto | lyme | archief | doneer | todo
πŸ•°οΈ
  ⬩  
✍️ Evert Mouw
  ⬩  
⏱️ 3 min

diffplus: zie snel verschillen tussen tekstversies

Doelgroep: *nix gebruikers, liefhebbers van de command line, informatici en andere technisch georiΓ«nteerde computergebruikers.

wdiff | colordiff

Soms wil je snel even de verschillen zien tussen twee tekstbestanden. Mogelijk heb je een configuratiebestand aangepast, en wil je de verschillen met een oude versie uit de backup bekijken. Of misschien werk je aan een paper en wil je jouw docent inzichtelijk maken welke veranderingen je hebt aangebracht. Er bestaan heel wat β€œdifference” tools, waaronder voor de GUI vriendelijke programma’s zoals WinMerge (opvolger van WinDiff) en Kompare. Voor de opdrachtregel of CLI omgeving (command line interface) zijn er diff, wdiff, colordiff, enzovoorts. Hoe je die slim kunt gebruiken staat op WebWereld.

Ik heb een eigen script diffplus.sh geschreven om gemakkelijker gebruik te kunnen maken van de goede CLI tools. Daarbij gebruik ik ook aha om ANSI kleurcodes naar HTML CSS om te kunnen zetten. Met mijn script kun je kiezen of je de uitvoer in less wilt zien, of in de text-based browser elinks, of dat je het wilt exporteren naar een HTML bestand. Het script kun je downloaden (diffplus.zip) of hieronder bekijken.

Hieronder een voorbeeld van diffplus.sh 1.txt 2.txt met de HTML uitvoer optie.

+———————————————————————–+ | 1.txt | +———————————————————————–+ | Dit is tekst nummer een. | | De eerste regel zegt niet veel. | | De tweede ook niet. |

+———————————————————————–+ | 2.txt | +———————————————————————–+ | Dit is tekst nummer twee. | | De eerste regel zegt niet zo heel veel. | | De tweede ook niet. | | De derde is scheepsrecht. |

+———————————————————————–+ | HTML uitvoer | +———————————————————————–+

Dit is tekst nummer [-een.-] {+twee.+}
De eerste regel zegt niet {+zo heel+} veel.
De tweede ook niet.
{+De derde is scheepsrecht.+}


De uitvoer lijkt me duidelijk genoeg. Hopelijk heb je er iets aan. Hieronder de broncode van het script.

#!/bin/sh
#
# Shows nice diff output, colorized.
# Evert Mouw , 2011-09-[20,23]
#
# inspiration (Dutch):
# http://webwereld.nl/tips-en-tools/107978/diff-voor-gevorderden.html
#
# aha converts ansi color codes to html [http://ziz.delphigl.com/tool_aha.php]
# an alternative could be: ansi2html.sh [http://www.pixelbeat.org/docs/terminal_colours/]
#
# execute a variable as a command can be done with $cmd,
# but sometimes you need eval: http://fvue.nl/wiki/Bash:_Why_use_eval_with_variable_expansion%3F
#
# testing for available commands with hash:
# http://stackoverflow.com/questions/592620/check-if-a-program-exists-from-a-bash-script

if [ -z $1 ]; then
    echo $(basename $0) helps with selecting diff utilities to see differences between text files.
    echo Usage: $(basename $0) file1 file2 \[menu_selection\]
    echo The script is intended for interactive use, echo but you can give the menu
    echo selection number as a third argument.
    exit 0
fi

if [ ! -f "$1" ]; then echo "I need two files to compare."; exit 1; fi
if [ ! -f "$2" ]; then echo "I need a second file to compare with."; exit 1; fi

for util in vimdiff wdiff colordiff aha less elinks; do
    hash $util 2>&- || { echo >&2 "I require $util but it's not installed."; abort="1"; }
done
if [ $abort ]; then exit 1; fi

S1="wdiff -n \"$1\" \"$2\" | colordiff"

if [ -z $3 ]; then
    echo "How do you want the diff?"
    echo " 0. cancel / exit"
    echo " 1. piped to less -R"
    echo " 2. piped to elinks"
    echo " 3. exported to \"$1_diff.html\""
    echo " 4. view or edit with vimdiff"
    read choice
else
    choice=$3
fi

case "$choice" in
    0) exit 0;;
    1) S2="| less -R";;
    2) S2="| aha | elinks -eval 'set mime.default_type = \"text/html\"'";;
    3) S2="| aha > $0_output.html";;
    4) S1="vimdiff \"$1\" \"$2\""; S2="";;
    *) echo "Invalid input, exiting."; exit 1;;
esac

cmd="$S1 $S2"
echo Executing: $cmd
eval $cmd

exit 0

Deze blogpost werd in december 2022 overgezet van WordPress naar een methode gebaseerd op Markdown; het is mogelijk dat hierbij fouten of wijzigingen zijn ontstaan t.o.v. de originele blogpost.