#1 Le 21/02/2018, à 11: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, à 11: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
Pour l'utiliser en Shell, tu trouveras tout ce dont tu as besoin sur internet Je suis plus Python perso donc je voudrais pas te dire n'importe quoi. Je souhaitais juste apporter ma pierre sur les regexs
En espérant t'avoir aidé
~ Data-sientist freelance : https://skulder.fr
Hors ligne
#3 Le 21/02/2018, à 11: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, à 11:49)
Hors ligne
#4 Le 21/02/2018, à 12: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
Dernière modification par shoot76 (Le 21/02/2018, à 12:01)
~ Data-sientist freelance : https://skulder.fr
Hors ligne
#5 Le 21/02/2018, à 12: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, à 12: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.
En ligne
#7 Le 21/02/2018, à 14: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, à 15:46)
Hors ligne
#8 Le 21/02/2018, à 15: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, à 15:15)
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( 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, à 15: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, à 15:38)
Hors ligne
#10 Le 21/02/2018, à 15: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, à 15:49
- shoot76
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
Et si tu rajoutes une négation dans ta condition?
~ Data-sientist freelance : https://skulder.fr
Hors ligne
#12 Le 21/02/2018, à 16:01
- payx
Re : Regarder si une variable contient des lettres
Ce n'est pas "!=~" le contraire de "=~" ?
Hors ligne
#13 Le 21/02/2018, à 16:12
- shoot76
Re : Regarder si une variable contient des lettres
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, à 16: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, à 16: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, à 16:38)
Hors ligne
#16 Le 21/02/2018, à 16: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, à 16: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, à 08:58
- payx
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 ^^
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, à 09:05)
Hors ligne
#19 Le 22/02/2018, à 09: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, à 09:15
- payx
Re : Regarder si une variable contient des lettres
Tu es têtu…
C'estfiltre='^[0-9.]+$'
Oui j'avoue. Désolé
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, à 09:21)
Hors ligne
#21 Le 22/02/2018, à 09:29
- shoot76
Re : Regarder si une variable contient des lettres
pingouinux a écrit :Tu es têtu…
C'estfiltre='^[0-9.]+$'
Oui j'avoue. Désolé
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, à 09:30)
~ Data-sientist freelance : https://skulder.fr
Hors ligne
#22 Le 22/02/2018, à 17: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, à 20:21)
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( 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, à 17:17
- pingouinux
Re : Regarder si une variable contient des lettres
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, à 20: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 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( 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, à 20:59
- Sciensous
Re : Regarder si une variable contient des lettres
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
antiX 19 et 21 et Ubuntu 20.04 et 22.04
( sous LXDE et gnome-shell )
Hors ligne