#1 Le 08/09/2019, à 15:23
- Christophe C
Extraire une chaine entre 2 chaines
Bonjour, j'ai un fichier avec pas mal de lignes (nb variable selon les cas).
Dans chaque ligne j'ai des données variables, mais la chaîne de caractère que je souhaite extraire est toujours entre les chaines name: et class.
Par exemple
kldfj djf q name:toto;class...
kldfj djf q name:tata;class...
kldfj djf q name:tutu;class...
et je voudrais récupérer en sortie
toto
tata
tutu
Cut n'est pas adapté puisque le séparateur ne fait qu'1 seul caractère (?), donc je pense à awk, mais j'ai du mal
Dernière modification par Christophe C (Le 08/09/2019, à 15:28)
BountySource - Faite un petit don, ponctuel ou récurent, pour soutenir le développement de XFCE.
Timeshift - Sécurité : pensez à paramétrer des points de restauration système.
Euclide : « Ce qui est affirmé sans preuve peut être nié sans preuve ».
Hors ligne
#2 Le 08/09/2019, à 15:34
- diesel
Re : Extraire une chaine entre 2 chaines
Ben..., je sais pas, mais essaye :
cut -d: -f2 toto.txt | cut -d";" -f1
Amicalement.
Jean-Marie
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#3 Le 08/09/2019, à 15:36
- nany
Re : Extraire une chaine entre 2 chaines
Bonjour,
grep -oP "(?<=name:).*(?=;class)" fichier
Hors ligne
#4 Le 08/09/2019, à 15:40
- Christophe C
Re : Extraire une chaine entre 2 chaines
Oui, je viens de me rendre compte qu'en enchaînant des cut avec des pipes, je m'en sort très bien.
Sympa le grep, c'est élégant. Bon, j'ai 2 options, je crois que je vais garder le grep, j'aime bien .
merci à vous 2.
BountySource - Faite un petit don, ponctuel ou récurent, pour soutenir le développement de XFCE.
Timeshift - Sécurité : pensez à paramétrer des points de restauration système.
Euclide : « Ce qui est affirmé sans preuve peut être nié sans preuve ».
Hors ligne
#5 Le 08/09/2019, à 15:44
- kamaris
Re : Extraire une chaine entre 2 chaines
Avec sed sinon :
sed -E 's/.*name:(.*);class.*/\1/' fichier
----
EDIT : si il peut y avoir dans fichier des lignes ne contenant pas le pattern recherché et qu'on ne souhaite pas afficher :
sed -nE '/.*name:(.*);class.*/{s//\1/; p}' fichier
Dernière modification par kamaris (Le 08/09/2019, à 15:57)
Hors ligne
#6 Le 08/09/2019, à 16:13
- diesel
Re : Extraire une chaine entre 2 chaines
Oui, je viens de me rendre compte qu'en enchaînant des cut avec des pipes, je m'en sors très bien.
Sympa le grep, c'est élégant. Bon, j'ai 2 options, je crois que je vais garder le grep, j'aime bien .
merci à vous 2.
Tu as parfaitement raison, le "grep" proposé par Nany est beaucoup plus propre et robuste que mon enchaînement de "cut". En effet, cela suppose qu'il n'y ait pas d'autres caractères ":" avant celui qui m'intéresse, ce qui est heureusement le cas dans l'exemple que tu nous as fourni, mais cela sera-t-il toujours vrai... ?
Amicalement.
Jean-Marie
Dernière modification par diesel (Le 08/09/2019, à 16:16)
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#7 Le 08/09/2019, à 16:51
- Christophe C
Re : Extraire une chaine entre 2 chaines
Encore merci à tous
BountySource - Faite un petit don, ponctuel ou récurent, pour soutenir le développement de XFCE.
Timeshift - Sécurité : pensez à paramétrer des points de restauration système.
Euclide : « Ce qui est affirmé sans preuve peut être nié sans preuve ».
Hors ligne
#8 Le 08/09/2019, à 20:04
- Watael
Re : Extraire une chaine entre 2 chaines
awk -F'[:;]' '{print $2}'
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#9 Le 08/09/2019, à 22:37
- Zakhar
Re : Extraire une chaine entre 2 chaines
Oui, je viens de me rendre compte qu'en enchaînant des cut avec des pipes, je m'en sort très bien.
Sympa le grep, c'est élégant. Bon, j'ai 2 options, je crois que je vais garder le grep, j'aime bien .
merci à vous 2.
Quant à moi je préfère sed!
On peut faire tout ce que fait grep avec sed, mais la réciproque n'est pas vraie.
Par exemple, avec sed, tu pourrais aussi traiter le cas où le pattern apparaît plusieurs fois sur la ligne... si c'était le cas !
(Bon, j'avoue, après ça devient vite incompréhensible !)
Exemple, le classique :
grep foo bar.txt
Se fait :
sed -n '/foo/p' bar.txt
Dernière modification par Zakhar (Le 08/09/2019, à 22:40)
"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)
Hors ligne
#10 Le 09/09/2019, à 07:40
- Christophe C
Re : Extraire une chaine entre 2 chaines
J'utilise sed sur certaines opérations de chaines, mais j'ai toujours du mal avec cette fonction, c'est vite dur à comprendre. Disons que quand je peu faire autrement, je le fait.
BountySource - Faite un petit don, ponctuel ou récurent, pour soutenir le développement de XFCE.
Timeshift - Sécurité : pensez à paramétrer des points de restauration système.
Euclide : « Ce qui est affirmé sans preuve peut être nié sans preuve ».
Hors ligne
#11 Le 09/09/2019, à 14:15
- Watael
Re : Extraire une chaine entre 2 chaines
sed n'est pas une fonction, c'est un langage, comme le shell, awk, python, perl...
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#12 Le 09/09/2019, à 14:29
- Zakhar
Re : Extraire une chaine entre 2 chaines
sed n'est pas une fonction, c'est un langage, comme le shell, awk, python, perl...
C'est vrai ;-)
"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)
Hors ligne
#13 Le 09/09/2019, à 14:47
- Christophe C
Re : Extraire une chaine entre 2 chaines
C'est un poil exagéré, puisqu'on ne peut que traiter des chaines. D'ailleurs cela se présente bien comme une commande, à la limite un éditeur de texte. Mais c'est vrai que les options sont très nombreuses.
BountySource - Faite un petit don, ponctuel ou récurent, pour soutenir le développement de XFCE.
Timeshift - Sécurité : pensez à paramétrer des points de restauration système.
Euclide : « Ce qui est affirmé sans preuve peut être nié sans preuve ».
Hors ligne
#14 Le 11/09/2019, à 12:50
- k3c
Re : Extraire une chaine entre 2 chaines
awk -F'[:;]' '{print $2}'
merci Watael pour cet exemple de awk avec plusieurs caractères dans le séparateur, c'était sans doute connu de tout le monde...sauf moi !
Debian 12 sur Thinkpad reconditionné
Hors ligne