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 09/06/2017, à 09:31

FlorianGlt

SED : Récupération de données

Bonjour,

J'essaye de récupérer une donnée précise dans une chaîne de caractère grâce à la fonction sed, pour le moment sans succès, malgré mes différentes recherches sur Internet.

123456#44444#DD#12345#1#1#Z#

Je souhaite récupérer les valeurs entre les deux premiers dièses (dans cet exemple 44444).

Si je fais "cat fichier.txt | sed -n "/[0-9]#[0-9]#DD#.*#/p" ça me retourne effectivement les lignes correspondantes. Cependant je n'arrive toujours pas a trouver la solution pour récupérer la chaîné souhaitée.

J'ai essayé entre autre "cat fichier.txt | sed -n "/[0-9]#([0-9])#DD#.#/p" ou bien "cat fichier.txt | sed -n "/[0-9]#([0-9])#DD#.#/\1/p".

Une suggestion ?

En vous remerciant tous par avance,

Florian.

Hors ligne

#2 Le 09/06/2017, à 09:41

pingouinux

Re : SED : Récupération de données

Bonjour,

$ sed -nr "s/[^#]+#([^#]+)#.*/\1/p" <<<"123456#44444#DD#12345#1#1#Z#"
44444

Ajouté :
Et pour prévoir le cas où aucun caractère ne précède le premier # :

$ sed -nr "s/[^#]*#([^#]+)#.*/\1/p" <<<"#44444#DD#12345#1#1#Z#"
44444

Dernière modification par pingouinux (Le 09/06/2017, à 09:47)

Hors ligne

#3 Le 09/06/2017, à 13:24

Hackedia

Re : SED : Récupération de données

Bonjour,

Je ne connais pas le contexte mais je connais une fonction qui est plus intéressante dans ton cas, ça s'appelle le ParameterExpansion, à l'inverse de SED qui lance un daemon pour exécuter la commande, ici le parameter expansion est directement interprété par le shell.

Dans ton cas le parameter expansion donnerai :
var="123456#44444#DD#12345#1#1#Z#"; var=${var#*#}; echo ${var%%#*}

Chaque regex va venir couper une partie de la chaine.

Le #*# signifie :
1ier #* : Partir du début jusqu'au premier charactère suivant
2iem # : Le charactère à prendre en compte (ici un dieze)

Et le %%#* signifie : Partir de la fin jusqu'au dernier dièze

C'est une approche différente avec une écriture différente du regex, j'essaye de l'utiliser le plus possible, c'est plus "greenIT" ^^,

Dernière modification par Hackedia (Le 09/06/2017, à 13:26)

Hors ligne