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 25/11/2022, à 16: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, à 16:26)

Hors ligne

#2 Le 25/11/2022, à 16: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, à 16: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, à 16: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, à 16:58)


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

Hors ligne

#5 Le 25/11/2022, à 17:27

Cosano

Re : [RESOLU] extraire sous chaine

alors ça ne m'affiche rien comme résultat

Hors ligne

#6 Le 25/11/2022, à 17:56

erresse

Re : [RESOLU] extraire sous chaine

Cosano a écrit :

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 résolu, 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, à 19:03

MicP

Re : [RESOLU] extraire sous chaine

Bonjour

Dans son message #5Cosano a écrit :

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, à 19:13)

Hors ligne

#8 Le 28/11/2022, à 12: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, à 12: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, à 12: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, à 13:41

Cosano

Re : [RESOLU] extraire sous chaine

matrix-bx a écrit :

Salut,
que donne

echo $0

ksh

Hors ligne

#12 Le 28/11/2022, à 13: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, à 14: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, à 14:39)

Hors ligne

#14 Le 28/11/2022, à 14: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, à 15:25

MicP

Re : [RESOLU] extraire sous chaine

Bonjour

Dans son message #9, Cosano a écrit :

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

Dans son message #9, Cosano a écrit :

… 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, à 15:39)

Hors ligne

#16 Le 28/11/2022, à 15: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, à 15: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, à 16: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, à 16:59)


Utilisations des balises de mises en formes.

Hors ligne

#19 Le 28/11/2022, à 16: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, à 16: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 smile

Hors ligne

#21 Le 29/11/2022, à 12: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, à 12:43)


Je suis un homme, quoi de plus naturel en somme ?
linux on the rocks

Hors ligne

#22 Le 29/11/2022, à 18:17

Watael

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 smile

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, à 17:39

Cosano

Re : [RESOLU] extraire sous chaine

joko a écrit :

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, à 17:47

Cosano

Re : [RESOLU] extraire sous chaine

Watael a écrit :
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 smile

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, à 17: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. big_smile
à 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, à 18:00)


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

Hors ligne