Question

Je cherche le meilleur moyen de faire une saisie simple:

echo -n "Enter a string here: "
read -e STRING

et nettoyez-le en supprimant les caractères non alphanumériques, les minuscules (casse) et en remplaçant les espaces par des traits de soulignement.

Est-ce que l'ordre est important? tr est-il le meilleur / le seul moyen de remédier à ce problème?

Était-ce utile?

La solution

Comme le souligne dj_segfault, le shell peut s’acquitter de la plupart de ces tâches à votre place. On dirait que vous devrez toutefois vous rabattre sur quelque chose d'extérieur. Pour cela, vous avez beaucoup d’options, comme le perl one-liners ci-dessus, etc., mais je pense que tr est probablement la plus simple.

# first, strip underscores
CLEAN=${STRING//_/}
# next, replace spaces with underscores
CLEAN=${CLEAN// /_}
# now, clean out anything that's not alphanumeric or an underscore
CLEAN=${CLEAN//[^a-zA-Z0-9_]/}
# finally, lowercase with TR
CLEAN=`echo -n $CLEAN | tr A-Z a-z`

L'ordre ici est quelque peu important. Nous voulons nous débarrasser des traits de soulignement et remplacer les espaces par des traits de soulignement. Nous devons donc nous assurer de supprimer les caractères de soulignement en premier. En attendant de laisser passer les choses jusqu'à la fin, nous savons que nous n'avons que des caractères de soulignement alphanumériques et, et nous pouvons être sûrs de ne pas avoir d'espaces, nous n'avons donc pas à nous soucier des caractères spéciaux interprétés par le shell.

Autres conseils

Bash peut le faire tout seul, merci beaucoup. Si vous consultez la section de la page de manuel consacrée à Développement des paramètres , vous verrez que cette bash contient des substitutions, des sous-chaînes, des ajustements, des rtrim, etc. intégrés.

Pour éliminer tous les caractères non alphanumériques, effectuez

CLEANSTRING=${STRING//[^a-zA-Z0-9]/}

C'est le rasoir d'Occam. Pas besoin de lancer un autre processus.

Rapide et sale:

STRING = `echo 'dit / ZOU / een test123' | perl -pe's / / / g; tr / [AZ] / [az] /; s / [^ a-zA-Z0-9 ] // g'`

Vous pouvez l'exécuter via Perl.

export CLEANSTRING=$(perl -e 'print join( q//, map { s/\\s+/_/g; lc } split /[^\\s\\w]+/, \$ENV{STRING} )')

J'utilise un sous-shell de style ksh ici, je ne suis pas tout à fait sûr que cela fonctionne avec bash.

C’est la bonne chose à propos de shell, c’est que vous pouvez utiliser perl, awk, sed, grep ....

Après quelques recherches, il semble que tr soit la méthode la plus simple:

export CLEANSTRING="`echo -n "${STRING}" | tr -cd '[:alnum:] [:space:]' | tr '[:space:]' '-'  | tr '[:upper:]' '[:lower:]'`"

Le rasoir d'Occam , je suppose.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top