rss
Rechercher : dans
Par : Pertinence Date Nom d'utilisateur
Statut : Non résolu

Exercice shell script (supprimer lignes)

Posté par momsse, le mercredi 9 mai 2007 à 12:41:55
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
Configuration: Mac OS X
Safari 419.3
Répondre à momsse  Signaler ce message aux modérateurs Aller au dernier message

1


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
momsse, le mercredi 9 mai 2007 à 12:44:36
Votre script devra également prendre en compte des intervalles de lignes via la notation numéro-début-ligne
Répondre à momsse

2


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
momsse, le mercredi 9 mai 2007 à 12:47:21
L'ennoncé entier est ici :

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

Je ne sais pas pourquoi ca me tronque la moitié ...
Répondre à momsse

3


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
fiddy, le mercredi 9 mai 2007 à 14:32:39
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
Répondre à fiddy

4


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
jipicy, le jeudi 10 mai 2007 à 00:28:56
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
;-))
Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.
Répondre à jipicy

11


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
 Niky !, le dimanche 17 février 2008 à 19:28:00
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
Répondre à Niky !
Logiciels pertinents trouvés dans les téléchargements
Télécharger SSH Secure Shell 3.0 build 203SSH Secure Shell - SSH secure shell for workstations est un client SSH flexible permettant de se connecter de façon sécurisée à des...Catégorie: Telnet/SSH
Licence: Open Source
Télécharger Support IPX pour Vista 1.0Support IPX pour Vista - Le protocole IPX/SPX sert à de nombreux anciens jeux pour pouvoir jouer en réseau (Red Alert, Command & Conquer, etc.). ...Catégorie: Librairies (DLL)
Licence: Freeware/gratuit
Télécharger All In One Video Script 1.0All In One Video Script - All In One Video Script est un script pour l'extension GreaseMonkey pour le navigateur Firefox permettant de détecter la...Catégorie: Vidéo
Licence: Freeware/gratuit
Télécharger ShellEnhancer  3.0.0.91ShellEnhancer - ShellEnchancer est un programme d'amélioration des fonctions de base de Windows. Il rend les interfaces plus stables et plus...Catégorie: Personnalisation
Licence: Freeware/gratuit
Plus de logiciels gratuits sur « Exercice shell script (supprimer lignes) »