Problème regex avec bash

Résolu
Bonjour !

Voilà, j'ai besoin de modifier une chaîne de caractères et j'ai l'impression d'utiliser beaucoup plus de commandes que nécessaire pour y arriver.

Je voudrais transformer les espaces en +, supprimer tout les caractères spéciaux SAUF les +, et finalement supprimer les + en doublons (ex ma++chaine+de+++caractères > ma+chaîne+de+caractères)

pour le moment je dois substituer les espaces par une chaine de caractères improbable

ma_chaine=$(sed 's/ /0123456789/g' <<< "${ma_chaine}")


pour que la commande suivante ne supprime pas les + :

ma_chaine=$(sed 's/[^[:alnum:]]\+//g' <<< "${ma_chaine}")


et ensuite je remets les espaces :

ma_chaine=$(sed 's/0123456789/+/g' <<< "${ma_chaine}")


Puis je supprime les doublons :

ma_chaine=$(sed 's/+\{2,\}/+/g' <<< "${ma_chaine}")


Je voulais donc savoir s'il n'y avait pas un moyen plus propre clair net et précis de faire la même chose ?

en une seule commande sed -e ce serait le top !

Merci d'avance !

4 réponses

  • Votes
  • Date
  • Date décroissante
  1. Contributeur
    Salut,

    On peut avoir un exemple de chaîne de caractères comprenant tous les caractères spéciaux dont tu parles et l'exemple de ce que tu veux en sortie ?
    1. Bien sur!

      par exemple
      ma_chaine="ma (chaine)     [de ]carac_tères"

      En sortie
      ma_chaine="ma+chaine+de+caractères"
      1. Contributeur
        Avec l'exemple donné :

        $ ma_chaine="ma (chaine) [de ]carac_tères"

        $ echo "${ma_chaine// /+}" | sed 's/[^[:alnum:]+]//g'
        ma+chaine+de+caractères
    2. Magnifique !

      Merci beaucoup, tu pourrais m'expliquer rapidement si ça ne te dérange pas ?
      Ou me donner un lien explicatif ?

      c'est surtout la première partie avant le pipe que je comprends pas.

      Si tu ne peux pas c'est pas grave tu m'as beaucoup aidé.
      merci !
      1. Contributeur
        man bash (remplacement de paramètres)
        $ ma_chaine="ma (chaine) [de ]carac_tères"

        $ echo "${ma_chaine// /+}"
        ma+(chaine)+[de+]carac_tères


        Sinon, si tu dois prendre en compte plusieurs espaces consécutifs (oublié dans ton exemple) :

        $ echo "${ma_chaine}"
        ma (chaine) [de ]carac_tères

        $ sed 's/ */+/g;s/[^[:alnum:]+]//g' <<<"${ma_chaine}"
        ma+chaine+de+caractère
      2. @zipe31Super
        Je me coucherai moins bête ce soir, bonne journée !
    3. Contributeur
      hello
      bash only
      $ c="ma (chaine)     [de ]carac_tères"; echo "$c"; c=${c//+( )/+}; c=${c//[^[:alnum:]|+]/}; echo "$c"
      ma (chaine) [de ]carac_tères
      ma+chaine+de+caractères