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é.
Le drapeau -c
(complément) de tr peut être une option
echo "Â10.41.89.50-._ " | tr -cd '[[:alnum:]]._-'
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
.
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
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
<`[[:alnum:]_.@]`
Cela a bien fonctionné pour moi. Il a conservé tous les caractères que j'ai spécifiés pour mes besoins.