#!/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[@]}"