74 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/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[@]}"
 |