Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 21/02/2018, à 12:05

payx

Regarder si une variable contient des lettres

Bonjour,

J'utilise Linux et je développe un petit script en shell dans lequel je prends une liste de mots / tags et je voudrais trier cette liste en enlevant tout les mots contenant autre chose que des chiffres des . ou des - et je ne sais pas comment m'y prendre.

Si vous avez des suggestions concernant certaines commandes pour réaliser ma tâche !

Merci !

Hors ligne

#2 Le 21/02/2018, à 12:23

shoot76

Re : Regarder si une variable contient des lettres

Bonjour,

Je t'invite à te renseigner sur les expressions régulières. Tu verras, au début c'est un peu bâtard ... (ça fait peur, pour être franc). Mais quand on commence à maitriser (et on maitrise jamais vraiment!) ça devient fort utile!

Pour toi, en l'occurrence, j'ai cette regex (regular expression) : [0-9|\-|.]+

De quoi ça parle ... [ ], tu définis un "ensemble". Au sein de cette ensemble, je lui dis : Prends moi tous les chiffres de 0 à 9 ou les tirets ou les points. Le + à la fin, c'est pour répéter sur plusieurs caractères (en l'espèce, tout ton mot). Ainsi, je matche tous les mots qui ne contiennent que des chiffres potentiellement mêlés avec des points ou des tirets. Après, faut adapter selon ton cas de figure bien entendu smile

Pour l'utiliser en Shell, tu trouveras tout ce dont tu as besoin sur internet smile Je suis plus Python perso donc je voudrais pas te dire n'importe quoi. Je souhaitais juste apporter ma pierre sur les regexs smile

En espérant t'avoir aidé


~ Data-sientist freelance : https://skulder.fr

Hors ligne

#3 Le 21/02/2018, à 12:48

payx

Re : Regarder si une variable contient des lettres

Et tu saurais aussi comment je peux détecter un retour "vide" c'est à dire que ma variable est vide ?

PS : Et comment on demande : est-ce que cette variable contient cette regex ?

Dernière modification par payx (Le 21/02/2018, à 12:49)

Hors ligne

#4 Le 21/02/2018, à 13:00

shoot76

Re : Regarder si une variable contient des lettres

re="[0-9|\-|.]+"
if [[ $VAR=~ $re ]]; then echo "ma variable répond à la regex"; fi

Pour la variable vide :

if [ -z "$VAR" ];

En faisant quelques recherches, on trouve tout ce qu'on veut smile

Dernière modification par shoot76 (Le 21/02/2018, à 13:01)


~ Data-sientist freelance : https://skulder.fr

Hors ligne

#5 Le 21/02/2018, à 13:03

pingouinux

Re : Regarder si une variable contient des lettres

Il faudrait que tu donnes un exemple. La commande suivante va supprimer tous les mots contenant autre chose que des chiffres, le point ou le tiret :

awk '{for(i=1;i<=NF;i++){if($i~/[^0-9.-]/)$i=""}print}' fichier

Hors ligne

#6 Le 21/02/2018, à 13:30

Watael

Re : Regarder si une variable contient des lettres

salut,

en bash :

rgx='^[0-9.-]+$'
if [[ $var =~ $rgx ]]; then echo "ok" ; else echo "ko"; fi

trier cette liste en enlevant tout les mots contenant autre chose que des chiffres des . ou des -

ce n'est pas un tri, mais un filtre.

il est toujours utile de mettre un exemple avant/après.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#7 Le 21/02/2018, à 15:03

payx

Re : Regarder si une variable contient des lettres

Alors merci de vos réponses !

C'est vrai que pour la variable vide je n'ai pas cherché.

Donc la commande awk supprime directement ?

Je vais essayé ça tout à l'heure. Merci encore

PS : Et si je ne veux pas inclure le mot "passe" à ma liste, je rajoute un "=! 'liste'" ?

PS2 : à quoi sert le '+$' ?

J'ai fait ça ducoup :

#!/bin/sh
filtre='^[0-9.-]+$'
TAG=v2.4.5
if [-z $TAG];
then
	echo "ko"
elif [[$TAG =~ $filtre]];
then
	echo "ko"
else  
	echo "ok"
fi

Il me met :

./abc.sh: line 4: [-z: command not found
./abc.sh: line 7: [[v2.4.5: command not found

Modération:
Merci d'appliquer une bonne édition sur le forum.
Insérer une miniature vers l' image pix.toile-libre.org voir aussi image et ici ou par script
Balises codes exemple

Dernière modification par enebre (Le 21/02/2018, à 16:46)

Hors ligne

#8 Le 21/02/2018, à 16:09

ar barzh paour

Re : Regarder si une variable contient des lettres

1- avec [ ]  l'espace est obligatoire [ -z $TAG ]
2- sh ne connait pas [[ ]]
donc essai

 #!/bin/bash
filtre='^[0-9.-]+$'
TAG=v2.4.5
if [ -z $TAG ]
then
    echo "ko"
elif [[ $TAG =~ $filtre ]];
then
    echo "ko"
else 
    echo "ok"
fi

va voir
https://abs.traduc.org/abs-fr/

Dernière modification par ar barzh paour (Le 21/02/2018, à 16:15)


PC          : B760M DS3H DDR4,  12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( en voyage )
Portable2 : T5750  @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )

Hors ligne

#9 Le 21/02/2018, à 16:33

payx

Re : Regarder si une variable contient des lettres

le TAG contient un 'v' et quand je lance le script il me sort "ok" et non pas "ko"

Pourquoi dans le elif il y a un double crochet dans ce cas là ?

Merci pour le lien je vais y jeter un oeil.

PS : J'ai testé avec filtre="[0-9|\-|.]+" et ça marche avec TAG = v2.4.5 mais pas avec TAG = 2.4.5, ko pour les deux

Dernière modification par payx (Le 21/02/2018, à 16:38)

Hors ligne

#10 Le 21/02/2018, à 16:47

enebre

Re : Regarder si une variable contient des lettres

Modération:
payx : Concerne votre post #7 , j'ai appliqué les balises codes, vous pouvez trouver le how-to ci-dessous dans ma signature.

Hors ligne

#11 Le 21/02/2018, à 16:49

shoot76

Re : Regarder si une variable contient des lettres

payx a écrit :

le TAG contient un 'v' et quand je lance le script il me sort "ok" et non pas "ko"

Pourquoi dans le elif il y a un double crochet dans ce cas là ?

Merci pour le lien je vais y jeter un oeil.

PS : J'ai testé avec filtre="[0-9|\-|.]+" et ça marche avec TAG = v2.4.5 mais pas avec TAG = 2.4.5, ko pour les deux

Et si tu rajoutes une négation dans ta condition? wink


~ Data-sientist freelance : https://skulder.fr

Hors ligne

#12 Le 21/02/2018, à 17:01

payx

Re : Regarder si une variable contient des lettres

Ce n'est pas "!=~" le contraire de "=~" ?

Hors ligne

#13 Le 21/02/2018, à 17:12

shoot76

Re : Regarder si une variable contient des lettres

payx a écrit :

Ce n'est pas "!=~" le contraire de "=~" ?

Pourquoi, ça marche pas chez toi?

Si ton script te sort OK pour v3.4.5 et KO pour 3.4.5, il suffit d'inverse les conditions en fait...


~ Data-sientist freelance : https://skulder.fr

Hors ligne

#14 Le 21/02/2018, à 17:26

pingouinux

Re : Regarder si une variable contient des lettres

Les deux derniers echo du script en #7 (et #8) sont inversés.

Hors ligne

#15 Le 21/02/2018, à 17:38

payx

Re : Regarder si une variable contient des lettres

Oui j'ai vu ducoup j'ai modifié,
J'ai ce code :

#!/bin/sh
filtre="[0-9|\-|.]+"
TAG=v2.4.5
if [ -z $TAG ];
then
	echo "ko"
fi
if [[ $TAG =~ $filtre ]];
then
	echo "ok"
else
	echo "ko"
fi

Pour TAG=v2.4.5 il me sort "ok" alors que normalement il ne devrait pas matcher à cause du v ..

Dernière modification par payx (Le 21/02/2018, à 17:38)

Hors ligne

#16 Le 21/02/2018, à 17:45

pingouinux

Re : Regarder si une variable contient des lettres

C'est normal, tu as modifié la variable filtre (voir #7 ou #8).

Hors ligne

#17 Le 21/02/2018, à 17:49

shoot76

Re : Regarder si une variable contient des lettres

filtre=^[0-9\\-\\.]+$
TAG="2.4.5"
if [ -z $TAG ];
then
	echo "ko"
fi
if [[ $TAG =~ $filtre ]];
then
	echo "ok"
else
	echo "ko"
fi

Maintenant ça fonctionne. Désolé, j'étais au boulot et sous W$ c'est difficile à tester ^^


~ Data-sientist freelance : https://skulder.fr

Hors ligne

#18 Le 22/02/2018, à 09:58

payx

Re : Regarder si une variable contient des lettres

shoot76 a écrit :
filtre=^[0-9\\-\\.]+$
TAG="2.4.5"
if [ -z $TAG ];
then
	echo "ko"
fi
if [[ $TAG =~ $filtre ]];
then
	echo "ok"
else
	echo "ko"
fi

Maintenant ça fonctionne. Désolé, j'étais au boulot et sous W$ c'est difficile à tester ^^

Merci pour ton temps !

quand je mets : TAG="---2.4.5" il me sort ko aussi !

Le "+$" permet de regarder si ça match sur tout les caractères ?

Dernière modification par payx (Le 22/02/2018, à 10:05)

Hors ligne

#19 Le 22/02/2018, à 10:09

pingouinux

Re : Regarder si une variable contient des lettres

Tu es têtu…
C'est

filtre='^[0-9.-]+$'

Hors ligne

#20 Le 22/02/2018, à 10:15

payx

Re : Regarder si une variable contient des lettres

pingouinux a écrit :

Tu es têtu…
C'est

filtre='^[0-9.]+$'

Oui j'avoue. Désolé hmm

Merci pour ton aide ça marche. Peut-tu me dire à quoi sert le '+$' ?

PS : et pourquoi j'ai besoin d'un double crochet pour

if [[ $TAG =~ $filtre ]];

Dernière modification par payx (Le 22/02/2018, à 10:21)

Hors ligne

#21 Le 22/02/2018, à 10:29

shoot76

Re : Regarder si une variable contient des lettres

payx a écrit :
pingouinux a écrit :

Tu es têtu…
C'est

filtre='^[0-9.]+$'

Oui j'avoue. Désolé hmm

Merci pour ton aide ça marche. Peut-tu me dire à quoi sert le '+$' ?

PS : et pourquoi j'ai besoin d'un double crochet pour

if [[ $TAG =~ $filtre ]];

le + sert à indiquer que tu vas avoir 1 à N caractères (un mot entier). Le $ sert à indiquer la fin du mot et ^ le début.

La combinaison ^$ permet d'être strict sur l'évaluation de l'expression régulière.

Dernière modification par shoot76 (Le 22/02/2018, à 10:30)


~ Data-sientist freelance : https://skulder.fr

Hors ligne

#22 Le 22/02/2018, à 18:02

ar barzh paour

Re : Regarder si une variable contient des lettres

@payx

la codification c'est tout plein de détails , la doc nous informe (il y en a qui connaisse sur le bout des doigts , ce n'est pas mon cas , je tâtonne beaucoup) , si on ne trouve pas on peut poser la question

PS : et pourquoi j'ai besoin d'un double crochet pour

if [[ $TAG =~ $filtre ]]

pour te donner un début de réponse possible

pour effectuer un test on a plusieurs possibilités dont celles-ci ( et il y en a d'autres)

utiliser test           :

 test expression

utiliser [ ... ]        :

 [ expression ]

utiliser [[  ... ]]     :

 [[ expression ]]

chaque solution peut avoir sa propre syntaxe , être ou non utilisable dans l'environnement
mais il faut aller voir la doc , car il faudrait trop développer
par exemple on a déjà vu que sh ne connaissait pas [[ ]]

c'est ainsi que avec [ ] on doit mettre les espaces           

[ -z $TAG ]

plus correctement

[ -z "$TAG" ]

mais au lieu de [ ] on aurait pu utiliser [[ ]] ( à condition d'utiliser bash et non sh )
et écrire
EDIT les espaces sont aussi obligatoires avec [[ ]] (voir post suivant) (ce sont les "" "" qui ne sont plus obligatoires ) , je me suis encore emmêlé les pinceaux
[[-z "$TAG"]] FAUX
ou

  [[ -z $TAG ]] 

ou
EDIT (ajout espace)

  [[ -z "$TAG" ]]

chaque commande ne fait que ce qu'on lui demande

cherche l'erreur

TAG="information très complète"
if [ $TAG = "information très complète" ];then echo "OK";fi

Dernière modification par ar barzh paour (Le 22/02/2018, à 21:21)


PC          : B760M DS3H DDR4,  12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( en voyage )
Portable2 : T5750  @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )

Hors ligne

#23 Le 22/02/2018, à 18:17

pingouinux

Re : Regarder si une variable contient des lettres

ar barzh paour #22 a écrit :

mais au lieu de [ ] on aurait pu utiliser [[ ]] ( à condition d'utiliser bash et non sh )
et écrire

  [[-z "$TAG"]]

ou

  [[ -z $TAG ]] 

ou

  [[-z $TAG]]

Seule la deuxième commande est correcte, les espaces sont obligatoires.

Hors ligne

#24 Le 22/02/2018, à 21:22

ar barzh paour

Re : Regarder si une variable contient des lettres

@ pingouinux j'ai essayé de rectifier mon post


PC          : B760M DS3H DDR4,  12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( en voyage )
Portable2 : T5750  @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )

Hors ligne

#25 Le 22/02/2018, à 21:59

Sciensous

Re : Regarder si une variable contient des lettres

ar barzh paour a écrit :

cherche l'erreur

TAG="information très complète"
if [ $TAG = "information très complète" ];then echo "OK";fi
"$TAG" au lieu de $TAG

wink


antiX 19 et 21 et Ubuntu 20.04 et 22.04
( sous LXDE et gnome-shell )

Hors ligne