#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source "$(dirname -- "$0")/lib/ulib/auto" || exit 1

function display_help() {
    uecho "$scriptname: modifier en masse un ensemble de valeurs numériques contigües dans un fichier

USAGE
    $scriptname FILE FROMmin-FROMmax TO

remplacer les nombres de FROMmin à FROMmax par leur valeur correspondante,
sachant que FROMmin doit être remplacé par TO. On peut mentionner autant de
couples (FROM, TO) que nécessaire: ils seront traités dans l'ordre

OPTIONS
    -n, --fake
        Afficher le fichier tel qu'il serait modifié au lieu de le modifier en
        place"
}

fake=
args=(
    --help '$exit_with display_help'
    -n,--fake fake=1
)
parse_args "$@"; set -- "${args[@]}"

file="$1"; shift
[ -n "$file" ] || die "vous devez spécifier le fichier à modifier"

seds=
while [ $# -ge 2 ]; do
    from="$1"
    if [[ "$from" == *-* ]]; then
        let fromb="${from%-*}"
        let frome="${from#*-}"
    else
        let fromb="$from"
        let frome="$from"
    fi
    let to="$2"; shift 2

    if [ "$to" -eq "$fromb" ]; then
        einfo "$fromb --> $to aucune modification n'est nécessaire"

    elif [ "$to" -lt "$fromb" ]; then
        einfo "$fromb-$frome --> $to-$((to+frome-fromb))"

        let from=fromb
        while [ "$from" -le "$frome" ]; do
            seds="$seds${seds:+; }s/$from/$to/g"
            let from=from+1
            let to=to+1
        done

    elif [ "$to" -gt "$fromb" ]; then
        einfo "$frome-$fromb --> $((to+frome-fromb))-$to"

        let from=frome
        let to=to+frome-fromb
        while [ "$from" -ge "$fromb" ]; do
            seds="$seds${seds:+; }s/$from/$to/g"
            let from=from-1
            let to=to-1
        done
    fi
done

edebug "Script sed: $seds"

[ -n "$fake" ] && args=() || args=(-i)
args+=("$seds" "$file")
sed "${args[@]}"