diff --git a/reginc b/reginc new file mode 100755 index 0000000..68acd27 --- /dev/null +++ b/reginc @@ -0,0 +1,73 @@ +#!/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[@]}"