Problème regex avec bash [Résolu]

CidHighwinds - 26 août 2017 à 13:06 - Dernière réponse : dubcek 17185 Messages postés lundi 15 janvier 2007Date d'inscriptionContributeurStatut 13 décembre 2017 Dernière intervention
- 27 août 2017 à 13:57
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 !
Afficher la suite 

7 réponses

Répondre au sujet
zipe31 35174 Messages postés dimanche 7 novembre 2010Date d'inscriptionContributeurStatut 11 décembre 2017 Dernière intervention - 26 août 2017 à 13:16
0
Utile
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 ?
Commenter la réponse de zipe31
CidHighwinds - 26 août 2017 à 13:48
0
Utile
1
Bien sur!

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

En sortie
ma_chaine="ma+chaine+de+caractères"
zipe31 35174 Messages postés dimanche 7 novembre 2010Date d'inscriptionContributeurStatut 11 décembre 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
Commenter la réponse de CidHighwinds
CidHighwinds - 26 août 2017 à 14:14
0
Utile
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 !
zipe31 35174 Messages postés dimanche 7 novembre 2010Date d'inscriptionContributeurStatut 11 décembre 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
CidHighwinds > zipe31 35174 Messages postés dimanche 7 novembre 2010Date d'inscriptionContributeurStatut 11 décembre 2017 Dernière intervention - 26 août 2017 à 14:27
Super
Je me coucherai moins bête ce soir, bonne journée !
Commenter la réponse de CidHighwinds
dubcek 17185 Messages postés lundi 15 janvier 2007Date d'inscriptionContributeurStatut 13 décembre 2017 Dernière intervention - 27 août 2017 à 13:57
0
Utile
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
Commenter la réponse de dubcek