programas - En un script bash, ¿cómo puedo desinfectar la entrada del usuario?
programacion shell linux ejemplos (5)
Bash puede hacer todo esto por sí mismo, muchas gracias. Si miras la sección de la página man en Parameter Expansion , verás que ese bash tiene sustituciones, subcadenas, trim, rtrim, etc. incorporadas.
Para eliminar todos los caracteres no alfanuméricos, haga
CLEANSTRING=${STRING//[^a-zA-Z0-9]/}
Esa es la navaja de Occam. No es necesario iniciar otro proceso.
Estoy buscando la mejor manera de tomar una entrada simple:
echo -n "Enter a string here: "
read -e STRING
y límpielo eliminando caracteres no alfanuméricos, menor (mayúscula) y reemplazando espacios con guiones bajos.
¿Importa el orden? ¿Es la mejor / única manera de hacer esto?
Como señala dj_segfault, el shell puede hacer la mayor parte de esto por usted. Sin embargo, parece que tendrás que recurrir a algo externo para encordar la cadena. Para esto tienes muchas opciones, como las de Perl de una línea anterior, etc., pero creo que tr es probablemente la más 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`
El orden aquí es algo importante. Queremos deshacernos de los guiones bajos, además de reemplazar los espacios con guiones bajos, por lo que debemos asegurarnos de quitar los guiones bajos primero. Al esperar para pasar las cosas hasta el final, sabemos que solo tenemos caracteres alfanuméricos y de subrayado, y podemos estar seguros de que no tenemos espacios, por lo que no tenemos que preocuparnos por los caracteres especiales que interpreta el intérprete de comandos.
Después de mirar un poco, parece que tr
es la forma más simple:
export CLEANSTRING="`echo -n "${STRING}" | tr -cd ''[:alnum:] [:space:]'' | tr ''[:space:]'' ''-'' | tr ''[:upper:]'' ''[:lower:]''`"
La navaja de Occam , supongo.
Podrías ejecutarlo a través de perl.
export CLEANSTRING=$(perl -e ''print join( q//, map { s///s+/_/g; lc } split /[^//s//w]+/, /$ENV{STRING} )'')
Estoy usando subshell ksh-style aquí, no estoy totalmente seguro de que funcione en bash.
Eso es lo bueno de Shell, es que puedes usar perl, awk, sed, grep ...
Rápido y sucio:
STRING=`echo ''dit /ZOU/ een test123'' | perl -pe''s/ / /g;tr/[AZ]/[az]/;s/[^a-zA-Z0-9 ]//g''`