web-dev-qa-db-fra.com

Suppression des caractères non alphanumériques avec sed

J'essaie de valider certaines entrées pour supprimer un ensemble de caractères. Seuls les caractères alphanumériques plus, point, trait de soulignement, trait d'union sont autorisés. J'ai testé l'expression regex [^\w.-] ici http://gskinner.com/RegExr/ et elle correspond à ce que je veux supprimer, donc je ne sais pas pourquoi sed renvoie le contraire. Qu'est-ce que je rate?

Mon objectif final est de saisir "Â10.41.89.50 " et d’obtenir "10.41.89.50 ".

J'ai essayé:

echo "Â10.41.89.50 " | sed s/[^\w.-]//g renvoie Â...

echo "Â10.41.89.50 " | sed s/[\w.-]//g et echo "Â10.41.89.50 " | sed s/[\w^.-]//g renvoie Â10418950

J'ai essayé la réponse trouvée ici Ignorer/supprimer les caractères non-ascii avec sed mais rien n'a été supprimé.

29
gorideyourbike

Le drapeau -c (complément) de tr peut être une option 

echo "Â10.41.89.50-._ " | tr -cd '[[:alnum:]]._-'
39
iruvar

Vous voudrez peut-être utiliser la classe [:alpha:] à la place:

echo "Â10.41.89.50 " | sed "s/[[:alpha:].-]//g"

devrait marcher. Sinon, vous devrez peut-être modifier vos paramètres locaux.

Par contre, si vous voulez seulement garder les chiffres, les tirets et le point:

echo "Â10.41.89.50 " | sed "s/[^[:digit:].-]//g"

Si votre chaîne est dans une variable, vous pouvez utiliser les extensions pures bash et parameter pour cela:

$ dirty="Â10.41.89.50 "
$ clean=${dirty//[^[:digit:].-]/}
$ echo "$clean"
10.41.89.50

ou

$ dirty="Â10.41.89.50 "
$ clean=${dirty//[[:alpha:]]/}
$ echo "$clean"
10.41.89.50

Vous pouvez également consulter la réponse de 1_CR.

11
gniourf_gniourf

Bien sed ne supportera pas les caractères unicode. Utilisez Perl à la place:

> s="Â10.41.89.50 "
> Perl -pe 's/[^\w.-]+//g' <<< "$s"
10.41.89.50
5
anubhava

Basé sur la réponse de anubhava, celle-ci a fonctionné pour moi:

s/^[[:alnum:]]//g

Remplacé autre chose que alphanumérique par un seul espace.

Remarque: "." les personnages sont préservés

0
Iwan Plays
<`[[:alnum:]_.@]`

Cela a bien fonctionné pour moi. Il a conservé tous les caractères que j'ai spécifiés pour mes besoins.

0
technerdius