Forum Programmation.shell Bash, regexp

Posté par (page perso) . Licence CC by-sa
Tags : aucun
3
12
mar.
2014

Bonjour,

je cherche à séparer des données d'une chaîne de caractère pour les écrire dans un tableau ou plusieurs variables, en bash.
La chaîne peut resembler à ceci:
'toto','tata' ,'titi' , 'ici avec espace','et, éventuellement\'comme ça'

On a donc:
'toto'
'tata'
'titi'
'ici avec espace'
'et, éventuellement\'comme ça'

Les espaces ne sont pas protégés par un \ (et même si cela avait été le cas, j'aurais été autant ennuyé).
J'ai parfois des caractères blancs autour des virgules.

J'ai essayé plein de trucs. Je peux séparer les champs avec awk en utilisant le délimiteur ' mais il faudrait que je puisse préciser de ne pas considérer les \'
J'ai aussi essayé avec sed, mais si j'écris :
sed "s/[^\\]'[\ ]*,[\ ]*'/'\n'/g"
cela me mange le dernier caractère de chaque champs, pourtant il me semblait que [^\\] c'était pour exclure le \

Donc, avec
sed "s/'[\ ]*,[\ ]*'/'\n'/g"
j'ai à peu près un résultat potable, mais je dois renoncer à traiter le cas des espaces dans les champs (pour le moment je n'ai qu'un seul cas comme ça)

Une fois ma chaîne nettoyée, j'utilise la commande suivante pour créer mon tableau:
read -a tableau <<< ${chaine}

Bien sur, dans le sed, je peux me contenter d'utiliser l'espace comme séparateur, puisque de toute façon le read -a s'en servira comme séparateur.

Si vous avez un moyen pour que les caractères échappés soient ignorés comme séparateurs, ou des suggestions… cela me rendrait grand service.

Merci
G

  • # Sed c'est bien ;-)

    Posté par . Évalué à 7.

    Salut,

    Un truc comme ça ?

    $ cat plop 
    'toto','tata' ,'titi' , 'ici avec espace','et, éventuellement\'comme ça'
    
    
    $ sed "s/' *, *'/'\n'/g" plop 
    'toto'
    'tata'
    'titi'
    'ici avec espace'
    'et, éventuellement\'comme ça'
    
    • [^] # Re: Sed c'est bien ;-)

      Posté par (page perso) . Évalué à 5.

      Sed c'est bien, encore faut-il savoir s'en servir correctement.

      C'est parfait, mon code est devenu bien plus simple… et maintenant je n'ai plus qu'à créer un tableau avec \n comme séparateur :) et il y a plusieurs solutions pour ça.

      Merci.

    • [^] # Re: Sed c'est bien ;-)

      Posté par (page perso) . Évalué à 2. Dernière modification le 13/03/14 à 08:41.

      Bonjour,

      je dois ajouter un tableau avec les clefs, mais ces clefs étant choisies arbitrairement dans mon script, j'ai pu me contenter d'une chaîne de caratères avec des espaces comme séparateurs.

      Je combine ça avec Awk, en lui transmettant la chaîne des clefs avec l'option -v, que je vais découper avec split.

      $machin2 c'est ma variable transformée en plusieurs lignes avec sed, comme vu précédemment.
      $champsConfS c'est ma chaîne de caractères : "clef0 clef1 clef2 …"

      echo -e "`{mathjax} machin2" | gawk -v champsConfS="`champsConfS" 'BEGIN {FS="\n" ; indice=0 ;  split(champsConfS,champsConfSTab," ")  } { tableau[indice]=$0 ; indice++ } END {for (indice in tableau) { print indice " : " champsConfSTab[indice+1] " -> " tableau[indice] } }'
      

      Awk donne un résultat dans le désordre, mais cela n'a pas d'importance, et je peux lui demander de trier avec sort ou isort (je ne l'ai pas encore fait)..

      Pour le moment, j'ai comme résultat (si c'est trié par indice):
      0 : clef0 -> 'toto'
      1 : clef1 -> 'tata'
      2 : clef2 -> 'titi'
      3 : … -> 'ici avec espace'

      Bien sur, au fur et à mesure que j'avance dans Awk, je me dis que tout mon script serait bien plus simple s'il était entièrement écrit en Awk.

      Bonne journée
      G

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.