Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 11/11/2011, 18h38   #1
Membre du Club
 
Femme
Inscription : septembre 2011
Messages : 54
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : septembre 2011
Messages : 54
Points : 52
Points : 52
Par défaut Tester tous les cas de présence ou non de 3 chaînes dans un fichier !

Bonjour,

Mon objectif est de faire des tests de contrôle sur 3 chaînes de caractères selon leur présence (ou non) dans un fichier, sans oublier aucun cas de figure possible! Pour chaque test, je dois afficher un message de succès ou d'échec sur l'écran, et l'écrire dans un fichier. Et pour me compliquer encore la vie, tous mes tests de contrôle doivent eux-mêmes se situer à l'intérieur d'une grande boucle if/then/else/fi...

Ce que je sais faire « à peu près » : tester la présence ou non d'un seul pattern dans un fichier (merci de corriger si j'ai faux, car je suis encore sûr de rien, Bonjour à: Sve@r, N_BaH et zipe31 ):

Code :
1
2
3
4
5
6
if grep "$EXP1" "myfile" > /dev/null 2>&1
             then 
                      blah blah… 
             else
                      blah blah ... 
             fi
Comment faire si je dois faire avec 2 autres patterns, et donc avec toutes les probabilités suivantes (EXP1, EXP2 et EXP3 sont des variables dans lesquelles, j'ai mis les chaînes recherchées.
)

1) Les 3 chaînes sont dans mon fichier.
2) Les 3 chaines n'y sont pas.
3) EXP1 seul y est, EXP2 et EXP3 n'y sont pas.
4) EXP2 seul y est, EXP1 et EXP3 n'y sont pas.
5) EXP3 seul y est, EXP1 et EXP2 n'y sont pas.
6) EXP1 et EXP2 y sont, EXP3 n'y est pas
7) EXP1 et EXP3 y sont, EXP2 n'y est pas
8) EXP2 et EXP3 y sont, EXP1 n'y est pas

Mes questions :
1) Ai-je cité tous les cas de combinaisons possibles ?
2) Comment couvrir tous les cas énumérés en utilisant peu de commandes ou en tout cas la méthode la plus élégante possible et surtout la plus courte (économe en nombre de if).

Voici mon grand if dans lequel doivent se situer mes tests de contrôle:

Code :
1
2
3
4
5
6
7
8
9
10
if [ -f myfile ] 
then
         cp myfile myfile.old
 
          ===> ZONE DE CONTROLE DES CHAINES  ====
         sed -i.OLD -e "s/^$EXP1$/$DON/" -e "/^$EXP2$/d" -e "/^$EXP2$/d" "myfile"
else
 
echo "Le fichier myfile n'existe pas dans $HOME"
fi
D'avance Merci !
bras39 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/11/2011, 21h49   #2
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
Bonjour,

Citation:
Comment faire si je dois faire avec 2 autres patterns, et donc avec toutes les probabilités suivantes (EXP1, EXP2 et EXP3 sont des variables dans lesquelles, j'ai mis les chaînes recherchées
tu itères les expressions recherchées dans une boucle for :
Code :
1
2
3
for expr in "$expr1" []
do if grep "$expr" []
   then
pour savoir quel cas correspond à une expression, tu utilises un flag qui sera incrémenté dans la boucle for (ici, sur 3 cas, ça va pas être trop compliqué) :
Code pseudo-code :
1
2
3
4
5
6
7
si flag existe
alors flag vaut flag +2
autre flag vaut 1
finsi
si expr_N est_dans fichier #if grep
alors match vaut match + flag
finsi
à peu près...
si aucune expression ne correspond match reste à zéro.
il y a d'autres possibilités pour définir flag, voire des manières de faire sans

finalement, utilise un case sur chaque valeur possible de match

?
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/11/2011, 22h32   #3
Membre du Club
 
Femme
Inscription : septembre 2011
Messages : 54
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : septembre 2011
Messages : 54
Points : 52
Points : 52
N_BaH, je suis désespéré, car je serais réellement incapable de programmer ce que tu viens de décrire
Je ne pensais pas que c'était si difficile - enfin tel que je le vois actuellement en tout cas...

Je pensais à un truc qui pourrait se résoudre en 1 ou 2 lignes (3 au maxi) commandes, avec par exemple un vieux egrep :

Code :
egrep "$EXP1|$EXP2|$EXP3" "myfile"
Et que toute la bataille va se jouer sur comment réduire les 8 possibilités que j'ai énumérées et dont certaines seraient logiquement inutiles voire erronées...
Là, du coup, je ne sais pas trop quoi faire...
bras39 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/11/2011, 22h52   #4
Membre confirmé
 
Homme Benjamin
Consultant informatique
Inscription : août 2007
Messages : 160
Détails du profil
Informations personnelles :
Nom : Homme Benjamin
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Consultant informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2007
Messages : 160
Points : 248
Points : 248
En faisant cela, tu aurais vu que tu peux définir plusieurs patterns de sélection en faisant cela :
Code :
grep -i 'PATTERN1|PATTERN2|PATTERN3' /my/file
bhamp0 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/11/2011, 22h56   #5
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
je me suis peut-être pris les pieds dans le tapis...

ôtes-moi un doute :
quelle importance de savoir si les regexp correspondent dans le fichier ?
faut-il les identifier pour accomplir des actions différentes selon le cas ?

c'est ce que j'ai compris :
Citation:
faire des tests de contrôle sur 3 chaînes de caractères selon leur présence (ou non) dans un fichier, sans oublier aucun cas de figure possible! Pour chaque test, je dois afficher un message de succès ou d'échec sur l'écran, et l'écrire dans un fichier.
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/11/2011, 23h08   #6
Membre du Club
 
Femme
Inscription : septembre 2011
Messages : 54
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : septembre 2011
Messages : 54
Points : 52
Points : 52
Citation:
Envoyé par N_BaH Voir le message
je me suis peut-être pris les pieds dans le tapis...

ôtes-moi un doute :
quelle importance de savoir si les regexp correspondent dans le fichier ?
faut-il les identifier pour accomplir des actions différentes selon le cas ?
Les 3 regexp sont différentes, et à chaque fois que je trouve une (ou je ne la trouve pas) dans le fichier, je dois faire un traitement et/ou afficher un simple message sur l'écran et l'écrire dans un fichier.
Si elles sont toutes dans le fichier, je sors de la boucle et passe à autre chose (l'étape suivante dans le script).
Si aucune n'est dans le fichier, alors là, je fais plusieurs traitement des mv, des cp, etc.
bras39 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/11/2011, 23h21   #7
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
Citation:
Les 3 regexp sont différentes, et à chaque fois que je trouve une (ou je ne la trouve pas) dans le fichier, je dois faire un traitement et/ou afficher un simple message sur l'écran et l'écrire dans un fichier.
ça demande quelques éclaircissements.

le traitement est-il différent selon que c'est l'expression 1, ou la 2, ou la 3, qui est trouvée ?
expr1 trouvée => traitement_1
expr2 trouvée => traitement_2

exprX et exprY trouvées => traitement_N
?

sinon, effectivement, si le traitement ne dépend que de la présence d'une des expressions, alors if egrep "$EXP1|$EXP2|$EXP3" "myfile"; then devrait suffire.

edit: ah mais là tu ne peux pas dire si elles y sont toutes; il faut donc les énumérer quand elles correspondent...
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/11/2011, 23h40   #8
Membre du Club
 
Femme
Inscription : septembre 2011
Messages : 54
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : septembre 2011
Messages : 54
Points : 52
Points : 52
Citation:
Envoyé par N_BaH Voir le message
ça demande quelques éclaircissements.

le traitement est-il différent selon que c'est l'expression 1, ou la 2, ou la 3, qui est trouvée ?
expr1 trouvée => traitement_1
expr2 trouvée => traitement_2

exprX et exprY trouvées => traitement_N
?

sinon, effectivement, si le traitement ne dépend que de la présence d'une des expressions, alors if egrep "$EXP1|$EXP2|$EXP3" "myfile"; then devrait suffire.

edit: ah mais là tu ne peux pas dire si elles y sont toutes; il faut donc les énumérer quand elles correspondent...
Non, le traitement est le même selon que :

exp1 trouvée => traitement_1&2...N
exp2 trouvée => traitement_1&2...N

expX et expY trouvées => traitement_1&2...N

Maintenant, d'un autre côté :
exp1 ET exp2 ET exp3...ET expN non-trouvées => traitement_particulier
bras39 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/11/2011, 00h17   #9
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
tu n'as donc que trois cas a considérer (en fait deux) :
Code pseudo-code :
1
2
3
4
5
cas $nbDoccurrences vaut
0) traitement : mv; cp
1 ou 2) traitement1&2
3) : #rien à faire
fincas
(on peut faire ça avec des évaluations arithmétiques)
par contre, il faut d'abord énumérer :
Code :
1
2
3
for expr in "$expr1" [...]
do if grep "$expr" [...] ; then nbDoccurrences=$(( $nbDoccurrences + 1 )); fi
done
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/11/2011, 00h31   #10
Membre du Club
 
Femme
Inscription : septembre 2011
Messages : 54
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : septembre 2011
Messages : 54
Points : 52
Points : 52
Citation:
Envoyé par N_BaH Voir le message
tu n'as donc que trois cas a considérer (en fait deux) :
[code=pseudo-code]cas $nbDoccurrences vaut
0) traitement : mv; cp
1 ou 2) traitement1&2
3) : #rien à faire
Je serais plutôt du côté du "case", mais quand je ferrai :

Code :
1
2
3
case     $nbDoccurrences in
 
0) traitement : mv, cp
Qu'est-ce que je mets au juste à la place de $nbDoccurrences ?
Et puis comment écrire exactement le "1 ou 2)", remplacer le "ou" par un "OR" ou un "|" ou bien le laisser tout simplement tel qu'il est ?
bras39 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/11/2011, 01h04   #11
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
Citation:
Qu'est-ce que je mets au juste à la place de $nbDoccurrences ?
tu le laisses ainsi (enfin, tu lui donnes le nom que tu veux, pourvu que le nom rende compte de sa fonction dans le script), sauf que l'incrémentation dans la boucle for ne fera jamais que nbDoccurrences vaille 0 :
s'il n'y a pas d'occurrence, nbDoccurrences n'aura pas de valeur, donc
Code :
1
2
3
4
5
6
case $nbDoccurrences in
'') traitement mv cp
;;
1|2) traitement_1&2
;;
esac
ou alors
Code :
1
2
3
4
5
6
case $((nbDoccurrences)) in
0) traitement mv cp
;;
1|2) traitement_1&2
;;
esac
ou encore
Code :
1
2
3
4
5
if ((! nbDocccurrences))
then : #traitement mv cp
elif (( nbDocccurrences < 3 ))
then : #traitement_1&2
fi
±
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/11/2011, 01h16   #12
Membre du Club
 
Femme
Inscription : septembre 2011
Messages : 54
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : septembre 2011
Messages : 54
Points : 52
Points : 52
Citation:
Envoyé par N_BaH Voir le message
tu le laisses ainsi (enfin, tu lui donnes le nom que tu veux, pourvu que le nom rende compte de sa fonction dans le script), sauf que l'incrémentation dans la boucle for ne fera jamais que nbDoccurrences vaille 0 :
s'il n'y a pas d'occurrence, nbDoccurrences n'aura pas de valeur, donc
Code :
1
2
3
4
5
6
case $nbDoccurrences in
'') traitement mv cp
;;
1|2) traitement_1&2
;;
esac
ou alors
Code :
1
2
3
4
5
6
case $((nbDoccurrences)) in
0) traitement mv cp
;;
1|2) traitement_1&2
;;
esac
ou encore
Code :
1
2
3
4
5
if (( nbDocccurrences && nbDocccurrences < 3 ))
then : #traitement_1&2
elif ((! var))
then : #traitement mv cp
fi
±
Intéréssant tout ça, mais si je me penche sur la 2ème ou la 3ème solution, est-ce que le $(()) ou le (()) tou court sont supportés par Solaris (avec un #!/bin/sh) ?
bras39 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/11/2011, 01h29   #13
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
probablement pas, ça ne fonctionne déjà pas avec ash...
par contre, la troisième, que j'ai simplifiée dans mon précédent post) est facilement transposable entre crochets simples.
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/11/2011, 01h40   #14
Membre du Club
 
Femme
Inscription : septembre 2011
Messages : 54
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : septembre 2011
Messages : 54
Points : 52
Points : 52
Citation:
Envoyé par N_BaH Voir le message
tu le laisses ainsi (enfin, tu lui donnes le nom que tu veux, pourvu que le nom rende compte de sa fonction dans le script), sauf que l'incrémentation dans la boucle for ne fera jamais que nbDoccurrences vaille 0 :
s'il n'y a pas d'occurrence, nbDoccurrences n'aura pas de valeur
Je reviens juste sur ce point, car il y a quelque chose qui m'échappe : de quelle boucle "for" tu parles ?
Quand je te demandais quoi mettre à la place du nbDoccurrences, je voudrais dire qui lui donnera ses valeur 0, 1|2 et 3) ? Comme on est dans un case, ces valeurs doivent-être connues à l'avance, mais ici je ne vois pas par quel moyen, à moins.
bras39 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/11/2011, 01h47   #15
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
Citation:
il faut d'abord énumérer :
Code :
1
2
3
for expr in "$expr1" [...]
do if grep "$expr" [...] ; then nbDoccurrences=$(( $nbDoccurrences + 1 )); fi
done
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/11/2011, 07h58   #16
Expert Confirmé Sénior
 
Avatar de Sve@r
 
Homme Frédéric
Ingénieur développement logiciels
Inscription : février 2006
Messages : 3 055
Détails du profil
Informations personnelles :
Nom : Homme Frédéric
Âge : 44
Localisation : France, Oise (Picardie)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2006
Messages : 3 055
Points : 4 934
Points : 4 934
Citation:
Envoyé par bras39 Voir le message
1) Les 3 chaînes sont dans mon fichier.
2) Les 3 chaines n'y sont pas.
3) EXP1 seul y est, EXP2 et EXP3 n'y sont pas.
4) EXP2 seul y est, EXP1 et EXP3 n'y sont pas.
5) EXP3 seul y est, EXP1 et EXP2 n'y sont pas.
6) EXP1 et EXP2 y sont, EXP3 n'y est pas
7) EXP1 et EXP3 y sont, EXP2 n'y est pas
8) EXP2 et EXP3 y sont, EXP1 n'y est pas

Mes questions :
1) Ai-je cité tous les cas de combinaisons possibles ?
Salut

Tu as dû faire des maths dans ta vie. Combien de cas possibles pour 3 éléments dont chacun peut prendre deux valeurs distinctes ? Réponse: 2^3

Citation:
Envoyé par N_BaH Voir le message
Bonjour,

tu itères les expressions recherchées dans une boucle for :
Code :
1
2
3
for expr in "$expr1" []
do if grep "$expr" []
   then
pour savoir quel cas correspond à une expression, tu utilises un flag qui sera incrémenté dans la boucle for (ici, sur 3 cas, ça va pas être trop compliqué) :
Code pseudo-code :
1
2
3
4
5
6
7
si flag existe
alors flag vaut flag +2
autre flag vaut 1
finsi
si expr_N est_dans fichier #if grep
alors match vaut match + flag
finsi
Amusant mais pourquoi utiliser 2 flags et un match ??? Pourquoi ne pas faire une analogie avec les droits Unix rwx ???
Associer elem1 à 4, elem2 à 2 et elem3 à 1
Si elemX est présent alors ajouter sa valeur à flag
Au final, si flag vaut
  • 0 => rien
  • 1 => elem3
  • 2 => elem2
  • 3 => elem2 et elem3
  • 4 => elem1
  • 5 => elem1 et elem3
  • 6 => elem1 et elem2
  • 7 => elem1 et elem2 et elem3
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit.
Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant.
Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation.
Dr. Adrian Rogers, 1931
Sve@r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/11/2011, 11h02   #17
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
Bonjour Sve@r,

Citation:
Associer elem1 à 4, elem2 à 2 et elem3 à 1
Je ne vois pas comment faire en étant strictement PSIX
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/11/2011, 14h22   #18
Membre du Club
 
Femme
Inscription : septembre 2011
Messages : 54
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : septembre 2011
Messages : 54
Points : 52
Points : 52
Bonjour N_BaH,

Je suis désolé, je n'arrive pas lorsque tu me me dis :

il faut d'abord énumérer :
Code :
1
2
3
4
 
for expr in "$expr1" [...]
do if grep "$expr" [...] ; then nbDoccurrences=$(( $nbDoccurrences + 1 )); fi
done
Dans ton code ci-dessus, où je dois placer les différents "case" ? En fait, je ne vois pas trop ce que je dois mettre dans tes différents "[....]" ci-dessus et surtout où et comment marier/harmoniser ton code avec le mien que voici :

Code :
1
2
3
4
5
6
7
8
9
10
if [ -f myfile ] 
then
         cp myfile myfile.old
 
          ===> ZONE DE CONTROLE DES CHAINES  ====
         sed -i.OLD -e "s/^$EXP1$/$DON/" -e "/^$EXP2$/d" -e "/^$EXP2$/d" "myfile"
else
 
echo "Le fichier myfile n'existe pas dans $HOME"
fi
bras39 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/11/2011, 15h01   #19
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Salut,

En espérant avoir tout compris...

Un petit exemple basé sur le nombre d'occurrences différentes rencontrées dans les différentes fichiers :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$ ls -1 fi*
fich      # Ne contient aucun des motifs recherchés
fich1     # Contient un seul motif recherché en plusieurs exemplaires
fich2     # Contient deux motifs recherchés en plusieurs exemplaires
fich3     # Contient les trois motifs recherchés en plusieurs exemplaires
 
$ cat foo.sh 
#! /bin/bash
 
for i in fich*
do
   nbr=$(grep -Eo 'A|W|Z' $i  | sort -u | wc -l)
 
   case "$nbr" in
	0)	echo "Fichier $i ne contient aucune occurrence";;
	1|2)	echo "Fichier $i contient une ou deux occurrence(s) différente(s)";;
	3)	echo "Fichier $i contient trois occurrences différentes";;
	*)	echo "Erreur";;
   esac
done
 
$ ./foo.sh 
Fichier fich ne contient aucune occurrence
Fichier fich1 contient une ou deux occurrence(s) différente(s)
Fichier fich2 contient une ou deux occurrence(s) différente(s)
Fichier fich3 contient trois occurrences différentes
 
$
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/11/2011, 15h34   #20
Membre du Club
 
Femme
Inscription : septembre 2011
Messages : 54
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : septembre 2011
Messages : 54
Points : 52
Points : 52
Citation:
Envoyé par zipe31 Voir le message
Salut,

En espérant avoir tout compris...

Un petit exemple basé sur le nombre d'occurrences différentes rencontrées dans les différentes fichiers :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$ ls -1 fi*
fich      # Ne contient aucun des motifs recherchés
fich1     # Contient un seul motif recherché en plusieurs exemplaires
fich2     # Contient deux motifs recherchés en plusieurs exemplaires
fich3     # Contient les trois motifs recherchés en plusieurs exemplaires
 
$ cat foo.sh 
#! /bin/bash
 
for i in fich*
do
   nbr=$(grep -Eo 'A|W|Z' $i  | sort -u | wc -l)
 
   case "$nbr" in
	0)	echo "Fichier $i ne contient aucune occurrence";;
	1|2)	echo "Fichier $i contient une ou deux occurrence(s) différente(s)";;
	3)	echo "Fichier $i contient trois occurrences différentes";;
	*)	echo "Erreur";;
   esac
done
 
$ ./foo.sh 
Fichier fich ne contient aucune occurrence
Fichier fich1 contient une ou deux occurrence(s) différente(s)
Fichier fich2 contient une ou deux occurrence(s) différente(s)
Fichier fich3 contient trois occurrences différentes
 
$
Bonjour zipe31,

Juste une petite précision : Je n'ai pas plusieurs fichier fich* dans lesquels je cherche des regexp. J'ai un seul fichier "myfile" qui contient 3 chaînes dont je cherche les occurrences. Et selon qu'elles existent ou non dans mon fichier, je dois faire des actions : des mv, des cp, de simples affichages sur l'écran et dans un fichiers, sortir sans rien faire, etc...

Par ailleurs, je ne vois toujours pas comment marier vos code avec le mien qui est ici (où je commence d'abord par tester si mon fichier "myfile" lui même existe, j'aimerai donc voir comment vous intégrez vos code au mien ) :

Code :
1
2
3
4
5
6
7
8
9
10
if [ -f myfile ] 
then
         cp myfile myfile.old
 
          ===> ZONE DE CONTROLE DES CHAINES  ====
         sed -i.OLD -e "s/^$EXP1$/$DON/" -e "/^$EXP2$/d" -e "/^$EXP2$/d" "myfile"
else
 
echo "Le fichier myfile n'existe pas dans $HOME"
fi
Les expressions à rechercher dans mon fichier "myfile" sont stockées dans les 3 variables : EXP1, EXP2, EXP3.
bras39 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h49.


 
 
 
 
Partenaires

Hébergement Web