[Linux] regexp sur une variable ?

Résolu
Salut,
Est-ce possible de s'amuser avec une regexp mais au lieu de faire ça sur un fichier, de le faire sur une variable histoire de pas encombrer le système inutilement ?

exemple :
$ mavariable="chaine de caractère 134 1 t231saluz"


de pouvoir faire une substitution avec une regexp sur cette chaine facilement ?!
s/RE/substitut/

je pense à sed mais ça peut être n'importe quel autre outil adapté et qui prenne en compte les regexp.
Il me semble qu'avec grep c'est pas vraiment ça.
merci.

2 réponses

  1. salut,

    en effet, grep est un outil de recherche/sélection, pas de manipulation.

    donc, oui, avec sed, awk, ...

    on peut aussi bidouiller une fonction en bash, ksh, zsh.

    sh, par contre, devra faire appel à des programmes externes.
    1. Ok, mais comment utiliser un de ces outils sur une simple variable et non un fichier ? Est-ce seulement possible ?
    2. à partir de bash, c'est simple ;)
      $ mavariable="chaine de caractère 134 1 t231saluz"
      $ [[ $mavariable =~ (134) ]] && echo "${mavariable/${BASH_REMATCH[1]}/autre_chose}"
      chaine de caractère autre_chose 1 t231saluz

      en zsh, je ne sais pas si ça ne searit pas être encore plus simple.

      sinon,
      echo "var" | sed 's/re/changement/'
      !
    3. le echo $var | sed
      va très bien, merci
  2. Contributeur
    Salut,

    En espérant avoir compris ta demande...

    $ mavariable="chaine de caractère 134 1 t231saluz"
    
    $ echo ${mavariable}
    chaine de caractère 134 1 t231saluz
    
    $ echo ${mavariable/134/256}
    chaine de caractère 256 1 t231saluz
    
    $ echo ${mavariable//a/A}
    chAine de cArActère 134 1 t231sAluz
    
    $ echo ${mavariable^^a}
    chAine de cArActère 134 1 t231sAluz
    
    $

    1. Salut, la question était simple, j'aimerai en gros m'exercer à faire des regexp sans devoir à chaque fois ouvrir un fichier, écrire dedans, et le sauver, et l'effacer à la fin.
      Donc faire ça dans une variable c'ést l'idéal.
      Tes solutions fonctionnement bien, mais dès qu'on fait appel à des groupes de caractères, par exemple s/.*\([0-9][0-9]*\).*/ \1/ ça ne fonctionne plus :(
    2. Contributeur
      Les shells ont vite leurs limites et les outils tels que sed, awk, etc. deviennent LA solution...

      Sinon plutôt qu'un echo et un pipe, du moins avec bash, tu peux aussi faire comme ça :

      sed 's/re/changement/' <<<${var}
    3. Tiens j'avais vu un triple chevron...
      C'est une bonne habitude à prendre de mettre les noms de variables entre accolades comme ça ?
      Je veux dire, ça ne changera jamais rien de les mettre entre accolades que sans accolades ? Ou y a-t-il une différence utile et nécessaire de temps en temps ?
    4. Contributeur
      C'est une bonne habitude à prendre de mettre les noms de variables entre accolades comme ça ?
      Oui !

      Je veux dire, ça ne changera jamais rien de les mettre entre accolades que sans accolades ? Ou y a-t-il une différence utile et nécessaire de temps en temps ?
      Le principal problème se situe au niveau de la concaténation de variables.
    5. bon, comme ce n'est pas demain que je risque de devoir concaténer des variables, ça devrait jouer :-)
      merci !