Besoin d'aide en Bash

Fermé
Utilisateur anonyme - 27 nov. 2003 à 21:16
asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 - 28 nov. 2003 à 02:24
si j'ai une variable x = (r1=1&r2=3&r3=4&r4=0&r5=5) par exemple, comment puis je faire pour retourner le nombre de `&` dans la phrase. J'ai essayer
egrep -c'&' $x
mais ca ne marche pas, je pense que c'est du au fait que x nèst pas un fichier
merci de votre aide, passez une bonne journee!

2 réponses

jisisv Messages postés 3645 Date d'inscription dimanche 18 mars 2001 Statut Modérateur Dernière intervention 15 janvier 2017 934
27 nov. 2003 à 23:29
Une solution avec awk
(je n'ai pas tout vérifié, mais c'est une piste...)
x='(r1=1&r2=3&r3=4&r4=0&r5=5)'
echo $x | awk 'BEGIN{FS="&"}{print NF-1;}'

Johan
The software said "Requires Windows98, Win2000, or better,
So I installed Unix.
0
asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 426
28 nov. 2003 à 02:24
Salut,

Le problème n'est pas que x soit une variable, rien ne t'empeche de faire
echo $x | grep...
Le probleme c'est que l'otption '-c ' renvoi le nombre de lignes ou le motif est trouvé.

Tu as plusieures solutions awk comme le disais Johan ou sed...

Pour une solution qui utilises les expressions réguliére, tu peux voir ça:
echo $x | sed 's/[^&]*//g' | tr -d '\n' | wc -m

-sed 's/[^&]*//g' -> sed 's/1/2/g'
Sed va fair une substitution (s) en remplacant 1 par 2 de maniere globale (g) (ie: sans le 'g' tu ne substitue 2 à la premiere occurence de 1 uniquement).
ici 1= [^&]* c'est à dire n'importe quel caractére sauf '&'
et 2 bah c'est rien :o)
Cette commande équivaut donc à supprimer tout ce qui n'est pas '&' !

-tr -d'\n'
Sed a le défault de rajouter un retour chariot la ou il n'y en a pas... donc on efface tout les '\n' que l'on trouve dans le résultat de la commande précédante (tr=translate, -d pour delete)

-wc -m
ensuite on compte le nombre de caracteres renvoyés par le pipeline (ou text stream
)
wc compte '\n' comme un caractère d'ou l'interet de les surpprimer à l'étape d'avant pour ne pas avoir à soustraire.

Voilà, la commande de johan fonctionne correctement à prioris, et est plus simple à taper, mais ne compte pas rééllement le nombre de caractères '&' trouvé...
C'est juste une histoire de mots ;o)

@++
"Si c'est stupide et que ça marche,
        alors ce n'est pas stupide"
0