#1 Le 25/11/2022, à 15:33
- Cosano
[RESOLU] extraire sous chaine
Salut,
j'ai une variable du genre :
titi bidule X123123 machin
et de cette variable je voudrais extraire X123123 (soit la sous chaine qui commence par X et qui est suivi de 6 chiffres. Son emplacement est variable donc je ne peux pas dire par exemple que j'extrais du 13 au 20eme caractère)
comment puis-je faire svp ?
Dernière modification par Cosano (Le 28/11/2022, à 15:26)
Hors ligne
#2 Le 25/11/2022, à 15:40
- Watael
Re : [RESOLU] extraire sous chaine
$ v='titi bidule X123123 machin'
$ rgx='.*(X[0-9]{6}).*'
$ [[ $v =~ $rgx ]]
$ printf '%s\n' "${BASH_REMATCH[1]}"
X123123
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#3 Le 25/11/2022, à 15:55
- Cosano
Re : [RESOLU] extraire sous chaine
merci,
avant que j'essaie, aurais tu la syntaxe qui me permette de valoriser le résultat dans une variable stp (plutôt que juste l'afficher) ?
du genre rez =<le resultat de ta commande>
une soluce à base de sed est envisageable ?
Hors ligne
#4 Le 25/11/2022, à 15:58
- Watael
Re : [RESOLU] extraire sous chaine
$ printf -v new "${BASH_REMATCH[1]}"
ou bêtement
new=${BASH_REMATCH[1]}
:)
sed est inutile ici.
Dernière modification par Watael (Le 25/11/2022, à 15:58)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#5 Le 25/11/2022, à 16:27
- Cosano
Re : [RESOLU] extraire sous chaine
alors ça ne m'affiche rien comme résultat
Hors ligne
#6 Le 25/11/2022, à 16:56
- erresse
Re : [RESOLU] extraire sous chaine
alors ça ne m'affiche rien comme résultat
Ben c'est bien normal... Si tu veux que ça s'affiche, c'est la syntaxe 1 et sinon ça génère le résultat dans une variable à charge pour toi de la faire s'afficher si tu veux voir son contenu.
Qu'est-ce qui te semble bizarre là-dedans ?
Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois le problème solutionné, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.
Hors ligne
#7 Le 25/11/2022, à 18:03
- MicP
Re : [RESOLU] extraire sous chaine
Bonjour
alors ça ne m'affiche rien comme résultat
Le contenu de ton message ne nous permet pas de savoir quelles sont les lignes de commandes que tu a entrées et quel a été le ou les messages d'erreur qui ont été éventuellement retournés.
En conséquence, il nous est impossible de te proposer une solution pertinente qui aurait pu te permettre de comprendre ce qui n'a pas fonctionné dans ta méthode d'application des solutions proposées.
Il vaudrait mieux que tu nous propose des Retour utilisable de commande afin de nous donner la possibilité de t'aider en fonction du contexte.
Tout ce que l'on peut essayer de faire, c'est tenter de reformuler les propositions de solution :
En utilisant les réponses données par Watael
en ligne de commande sur mon système,
ça donnerait :
michel@deb115:~$ variableDuGenre="titi bidule X123123 machin"
michel@deb115:~$ rgx='.*(X[0-9]{6}).*'
michel@deb115:~$ [[ $variableDuGenre =~ $rgx ]]
michel@deb115:~$ rez="${BASH_REMATCH[1]}"
michel@deb115:~$ echo "$rez"
X123123
michel@deb115:~$
Dernière modification par MicP (Le 25/11/2022, à 18:13)
Hors ligne
#8 Le 28/11/2022, à 11:13
- Cosano
Re : [RESOLU] extraire sous chaine
Salut,
voilà le retour de mes commandes:
(c'est du copé collé autant forum vers mon terminal que terminal vers forum. J'ai uniquement remplacé le prompt pour masquer les infos de la machine)
A savoir que je suis sur RedHat
prompt> variableDuGenre="titi bidule X123123 machin"
prompt> rgx='.*(X[0-9]{6}).*'
prompt> [[ $variableDuGenre =~ $rgx ]]
prompt> rez="${BASH_REMATCH[1]}"
prompt> echo "$rez"
prompt>
Hors ligne
#9 Le 28/11/2022, à 11:39
- Cosano
Re : [RESOLU] extraire sous chaine
en en réalité ça orientera peut être vos réponses vers une autre soluce, mais il s'agit pour moi de parcourir un fichier texte et d'en extraire ce qui match avec X123123 pour le repositionner ailleurs dans la ligne
du genre :
date;;;X123123;; devient date;X123123;;;;
date;;;X456456;; devient date;X456456;;;;
date;;;toto1234;; ne change pas car on match pas avec la regexp
date;;truc;;X123678; devient date;X123678;truc;;
je récupère le X[0-9]{6} où qu'il se trouve et je le met après le 2eme ;
Hors ligne
#10 Le 28/11/2022, à 11:47
- matrix-bx
Re : [RESOLU] extraire sous chaine
Salut,
que donne
echo $0
Utilisations des balises de mises en formes.
Hors ligne
#11 Le 28/11/2022, à 12:41
- Cosano
Re : [RESOLU] extraire sous chaine
Salut,
que donneecho $0
ksh
Hors ligne
#12 Le 28/11/2022, à 12:57
- matrix-bx
Re : [RESOLU] extraire sous chaine
Je m'en doutais un peu.
Comme son nom le laisse entendre, la variable d'environnement BASH_REMATCH implique d'utiliser bash comme shell.
Utilisations des balises de mises en formes.
Hors ligne
#13 Le 28/11/2022, à 13:39
- Cosano
Re : [RESOLU] extraire sous chaine
et du coup je me casse les dents sur la recherche de la bonne formule à base de sed
des trucs comme ça mais je ne trouve pas la syntaxe exacte
echo $var | sed -i 's/.*(M[0-9]{6}).*/\1/p'
Dernière modification par Cosano (Le 28/11/2022, à 13:39)
Hors ligne
#14 Le 28/11/2022, à 13:50
- pingouinux
Re : [RESOLU] extraire sous chaine
Bonjour,
Ceci ?
sed -rn 's/(date;)(.*)(X[0-9]{6})/\1\3\2/p' <<<"date;;;X123123;;"
Résultat :
date;X123123;;;;
Hors ligne
#15 Le 28/11/2022, à 14:25
- MicP
Re : [RESOLU] extraire sous chaine
Bonjour
en en réalité ça orientera peut être vos réponses vers une autre soluce, mais il s'agit pour moi de parcourir un fichier texte …
… du genre :
date;;;X123123;; devient date;X123123;;;;
date;;;X456456;; devient date;X456456;;;;
date;;;toto1234;; ne change pas car on match pas avec la regexp
date;;truc;;X123678; devient date;X123678;truc;;
Ça ressemble beaucoup au contenu d'un fichier de type csv
… et d'en extraire ce qui match avec X123123 pour le repositionner ailleurs dans la ligne … je récupère le X[0-9]{6} où qu'il se trouve et je le met après le 2eme ; …
Est-ce que, si par hasard il s'agissait d'un fichier de type csv, la valeur à déplacer (sous condition de son format) ne serait pas située dans la même colonne de chacun des enregistrements ?
Est-ce que les champs de la colonne N°2 sont tous vides, et si non, est-ce qu'il faudra "écraser" le contenu original de ce champ par la valeur récupérée ?
S'il s'agit bien d'un fichier de type csv et suivant le travail à lui faire faire
la commande awk (ou gnu awk <=> gawk ) pourrait être bien plus efficace que sed
Dernière modification par MicP (Le 28/11/2022, à 14:39)
Hors ligne
#16 Le 28/11/2022, à 14:32
- Cosano
Re : [RESOLU] extraire sous chaine
oui c'est un csv. la valeur que je cherche se trouve toujours bien dans la même colonne mais dans un champ libre, noyée parmis un tas d'autres infos. C'est pour ça que je ne cherche que ce qui matche avec M[1-9]{7,8} dans la colonne qui m'intéresse
Hors ligne
#17 Le 28/11/2022, à 14:39
- Cosano
Re : [RESOLU] extraire sous chaine
plus précisément ça ressemble à ça
date;;; oulala X123123 grumble;;
devient
date;X123123;;; oulala X123123 grumble;
et j'aimerais récupérer X123123 dans une variable pour d'autres besoins
Hors ligne
#18 Le 28/11/2022, à 15:09
- matrix-bx
Re : [RESOLU] extraire sous chaine
C'est pas très élégant, mais
matrix-bx@laptop:~$ cat testfile.csv
date;;; oulala X123123 grumble;;
date;;; oulala X444555 grumble;;
date;;; chat X111111 grumble;;
date;;;X121212 chien grumble;;
date;;; oulala poneys X666777 grumble;;
matrix-bx@laptop:~$
matrix-bx@laptop:~$ while read ligne ; do
VAR=$(for string in $(echo $ligne | awk -F";" '{ print $4 }') ; do echo $string | grep -E "^(X[0-9]{6})$"; done )
echo $ligne | awk -F";" -v var=$VAR '{ print $1";"var";"$3";"$4";"$5";"$6";" }'
done < testfile.csv
date;X123123;; oulala X123123 grumble;;;
date;X444555;; oulala X444555 grumble;;;
date;X111111;; chat X111111 grumble;;;
date;X121212;;X121212 chien grumble;;;
date;X666777;; oulala poneys X666777 grumble;;;
matrix-bx@laptop:~$
Dernière modification par matrix-bx (Le 28/11/2022, à 15:59)
Utilisations des balises de mises en formes.
Hors ligne
#19 Le 28/11/2022, à 15:10
- Cosano
Re : [RESOLU] extraire sous chaine
j'ai trouvé (on m'a trouvé) un truc qui me va
echo $var | grep -Eo 'M[0-9]{7,8}'
Hors ligne
#20 Le 28/11/2022, à 15:12
- Cosano
Re : [RESOLU] extraire sous chaine
@pingouinux et matrix-bx je garde vos soluces sous le coude pour les explorer si jamais je vois que ma soluce ne convient pas
merci
Hors ligne
#21 Le 29/11/2022, à 11:42
- joko
Re : [RESOLU] extraire sous chaine
J'avance cette soluce :
a="titi bidule X123123 machin"
chaine=$(echo "$a" | grep -o X[0-9]*)
echo "$chaine"
Je précise que ce n'est pas forcément la plus adaptée à votre besoin.
Dernière modification par joko (Le 29/11/2022, à 11:43)
Je suis un homme, quoi de plus naturel en somme ?
linux on the rocks
Hors ligne
#22 Le 29/11/2022, à 17:17
- Watael
Re : [RESOLU] extraire sous chaine
@pingouinux et matrix-bx je garde vos soluces sous le coude pour les explorer si jamais je vois que ma soluce ne convient pas
merci
ben, il faut pas.
$ awk 'BEGIN{FS=OFS=";"}NF==6{match($0,"X[0-9]{6}"); m=substr($0,RSTART,RLENGTH); $1=$1";"m}1' fichier.csv
NF==6 pour vérifier que la transformation n'a pas été déjà opérée (puisque la transformation ajoute un champ), mais on pourrait tester d'autres choses (que le deuxième champ est vide, par exemple).
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#23 Le 30/11/2022, à 16:39
- Cosano
Re : [RESOLU] extraire sous chaine
J'avance cette soluce :
a="titi bidule X123123 machin" chaine=$(echo "$a" | grep -o X[0-9]*) echo "$chaine"
Je précise que ce n'est pas forcément la plus adaptée à votre besoin.
si c'est carrément bien cette soluce. je dois ajouter -Eo pour que grep considère que c'est une regexp
Hors ligne
#24 Le 30/11/2022, à 16:47
- Cosano
Re : [RESOLU] extraire sous chaine
Cosano a écrit :@pingouinux et matrix-bx je garde vos soluces sous le coude pour les explorer si jamais je vois que ma soluce ne convient pas
merci
ben, il faut pas.
$ awk 'BEGIN{FS=OFS=";"}NF==6{match($0,"X[0-9]{6}"); m=substr($0,RSTART,RLENGTH); $1=$1";"m}1' fichier.csv
NF==6 pour vérifier que la transformation n'a pas été déjà opérée (puisque la transformation ajoute un champ), mais on pourrait tester d'autres choses (que le deuxième champ est vide, par exemple).
le 2 champ est toujours vide (c'est moi qui le crée vide pour l'alimenter ensuite)
et effectivement j'ai trouvé le bon moyen d'isoler la valeur qui me convient avec le grep -Eo mais je rencontre déjà un souci : si j'ai 2 occurences, ça récupère les 2 (pour l'instant je vais m'en contenter
Hors ligne
#25 Le 30/11/2022, à 16:59
- Watael
Re : [RESOLU] extraire sous chaine
ok, donc :
awk 'BEGIN{FS=OFS=";"}{match($0,"X[0-9]{6}"); $2=substr($0,RSTART,RLENGTH)}1' fichier.csv
mais pour qu'on te propose une solution robuste (de toutes façons, ce sera UN awk), il faut nous présenter un fichier exemple qui tient compte de toutes les objections que tu vas nous faire.
à chaque fois qu'une "exception" se pointe.
mais, si tu crées le deuxième champ vide avant, alors on peut gérer ça pour toi dans le awk, comme je l'ai fait précédemment.
Dernière modification par Watael (Le 30/11/2022, à 17:00)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne