Salut,
Le seul problème qui persiste est au niveau d'un paramètre matchant une ligne n'existant pas (
en dehors des lignes de départ existantes) et qui génére donc une erreur 6 (
dernier cas du "case ... esac"). Donc à régler...
#! /bin/bash
# enlever-des-lignes.sh
# Déclaration fonction d'usage
fonction_usage ()
{
echo -e "\tUsage : $0 [n|n-n]\n"
echo -e "\tn est un entier positif."
echo -e "\tn-n est un intervalle (eg. 6-15)"
echo -e "\tLes entiers seront séparés par un espace.\n\
Les intervalles n-n séparés par un tiret \"-\".\n"
}
# Test existence fichier
if [ ! -e "$1" ]; then
echo -e "Le fichier $1 n'existe pas ! \n"
fonction_usage
exit 2
fi
# Test nombre de paramètres
if [ "$#" -lt 2 ]; then
echo -e "Nombre de paramètres incorrects ! \n\n"
fonction_usage
exit 3
fi
# Test entier positif et/ou mauvais intervalle
for n in "$@"; do
case "$n" in
-* ) echo -e "Les entiers doivent être de type positif !\n"
fonction_usage
exit 4
;;
*-* ) var1=$(echo $n | cut -d- -f1)
var2=$(echo $n | cut -d- -f2)
if [ "$var1" -gt "$var2" ]; then
echo -e "Erreur dans l'intervalle \"$n\"\n"
fonction_usage
exit 5
fi
;;
[0-9]*[!-][0-9]* ) echo -e "Le caractère séparateur d'intervalle n'est pas un tiret !\n"
fonction_usage
exit 6
;;
esac
done
##### Début du script #####
# Initialisation variable fichier (pour libérer le paramètres $1)
fichier=$1
# Décalage des paramètres
shift
# Initialisation des paramètres en passant par :
#+ substitution espace par saut de ligne
#++ tri numérique
#+++ substitution saut de ligne par espace et
#++++ substitution tiret par virgule
set $(echo "$@" | sed 's/ /\n/g'| sort -n | sed -e :a -e '$!N;s/\n/ /;ta' -e 's/-/,/g')
# Initialisatieon compteur
n=1
# Initialisation variable "cmd" (sed)
cmd="sed "
# Boucle tant que compteur inférieur au nombre de paramètres
while [ "$n" -le "$#" ]
do
# On rajoute à la variable "cmd" le reste de la commande sed
cmd="$cmd-e ''\$$n'd' "
# On incrémente le compteur
n=$(expr $n + 1)
done
# On exécute la commande (cmd) qui doit ressembler pour 4 paramètres initiaux à :
#+ sed -e ''$1'd ' -e ''$2'd ' -e ''$3'd ' $fichier
eval $cmd $fichier
;-))
Comme j'ai pas trouvé de merci dans ce thread... Je trouvai normal de le dire!
Donc MERCI pour ce script, même s'il ne me servait pas directement... et même si je remonte un vieux post!
PS : J'avais juste oublier la différence entre $* $# et $@, et j'ai trouvé.
Merchi à vous ;-))
</ModeRougeCommeUnCoquelicot>