Signaler

Problème regex avec bash [Résolu]

Posez votre question CidHighwinds - Dernière réponse le 27 août 2017 à 13:57 par dubcek
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 !
Utile
+0
plus moins
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 ?
Donnez votre avis
Utile
+0
plus moins
Bien sur!

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

En sortie
ma_chaine="ma+chaine+de+caractères"
zipe31 35043Messages postés dimanche 7 novembre 2010Date d'inscription ContributeurStatut 10 octobre 2017 Dernière intervention - 26 août 2017 à 13:56
Avec l'exemple donné :

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

$ echo "${ma_chaine// /+}" | sed 's/[^[:alnum:]+]//g'
ma+chaine+de+caractères
Répondre
Donnez votre avis
Utile
+0
plus moins
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 !
zipe31 35043Messages postés dimanche 7 novembre 2010Date d'inscription ContributeurStatut 10 octobre 2017 Dernière intervention - 26 août 2017 à 14:23
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
Répondre
CidHighwinds- 26 août 2017 à 14:27
Super
Je me coucherai moins bête ce soir, bonne journée !
Répondre
Donnez votre avis
Utile
+0
plus moins
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
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !