Exercice shell script (supprimer lignes)

Fermé
momsse - 9 mai 2007 à 12:41
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 - 18 mars 2009 à 19:20
Bonjour,

Encore un exercice coriace dont je n'arrive pas à me défaire (ca me démoralise), voila l'énnoncé :

Écrire un script shell enlever-des-lignes.sh qui prend en premier paramètre un nom de fichier puis une liste d’entier.
Ce script doit renvoyer sur la sortie standard le contenu du fichier passé en premier paramètre auquel on aura supprimé les lignes passée via les autres paramètres. Par exemple,

$ ./supprime-ligne fichier.txt 2 5 11 devra renvoyer le contenu du fichier fichier.txt supprimé des lignes 2, 5 et 11.

Votre script devra supporter n’importe quel ordre de passage des numéros de lignes. Par exemple,

$ ./supprime-ligne fichier.txt 11 2 5 aura le même effet.
Votre script devra également prendre en compte des intervalles de lignes via la notation ?numéro-début-ligne
A voir également:

6 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
10 mai 2007 à 00:28
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
;-))
16
J'ai rarement vu quelqu'un répondre aussi bien à un post! Quoi que comme c'était un exercice certains pourrait dire (à raison) qu'il aurait mieux valut le laisser chercher un peu!
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é.
0
hugnix Messages postés 119 Date d'inscription samedi 9 juin 2007 Statut Membre Dernière intervention 27 avril 2009 > ninititine
10 oct. 2008 à 17:16
Merci pour lui, jipicy est toujours là pour bien expliqué et trouvé une soluce à ton problème, moi il m'a bien aider en tout les cas et j'ai,grâce à lui, compris pas mal de choses sur le scrpit shell!!!!
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895 > ninititine
10 oct. 2008 à 18:34
<ModeRougeCommeUnCoquelicot>
Merchi à vous ;-))
</ModeRougeCommeUnCoquelicot>
0
Votre script devra également prendre en compte des intervalles de lignes via la notation numéro-début-ligne
0
L'ennoncé entier est ici :

http://momsse.free.fr/exo.rtf

Je ne sais pas pourquoi ca me tronque la moitié ...
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
9 mai 2007 à 14:32
Utilise la commande sed : sed '1,10d' efface les 10 premières lignes, à partir de là. A toi de changer l'argument de sed pour l'adapter à tes besoins
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Salut !

J'ai pas compris :
if [ ! -e "$1" ]
dans le test d'existence du fichier.

que veut dire le " -e"?
Je veux également savoir quand est-ce qu'on utilise l'eval

10x
0
snow_frog Messages postés 216 Date d'inscription jeudi 5 février 2009 Statut Membre Dernière intervention 26 juin 2020 139
18 mars 2009 à 19:13
je dirai que -e signifie "equal" ?

à confirmer

oups désolé pour le deterrage...
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
18 mars 2009 à 19:15
Perdu ;-))

-e = existe

;-))
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835 > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
18 mars 2009 à 19:18
Trop rapide pour moi :d.
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895 > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
18 mars 2009 à 19:20
T'en fais pô, ça va viendre ;-))
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
18 mars 2009 à 19:17
Salut,
Non, -e permet de savoir si le fichier existe.
Cdlt
0