Pregunta

Estoy buscando la mejor manera de recibir una entrada simple:

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

y límpielo eliminando caracteres no alfanuméricos, minúsculas (mayúsculas) y reemplazando espacios con guiones bajos.

¿Importa el orden?Es tr ¿Cuál es la mejor/única manera de hacer esto?

¿Fue útil?

Solución

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 poner la cadena en minúsculas.Para esto tienes muchas opciones, como las frases ingeniosas de Perl anteriores, 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 y reemplazar los espacios con guiones bajos, por lo que primero debemos asegurarnos de eliminar los guiones bajos.Al esperar a pasar cosas a tr hasta el final, sabemos que solo tenemos caracteres alfanuméricos y guiones bajos, y podemos estar seguros de que no tenemos espacios, por lo que no tenemos que preocuparnos de que el shell interprete caracteres especiales.

Otros consejos

Bash puede hacer todo esto por sí solo, muchas gracias.Si miras la sección de la página de manual en Expansión de parámetros, verás que ese bash tiene sustituciones integradas, subcadenas, recortes, rtrim, etc.

Para eliminar todos los caracteres no alfanuméricos, haga

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

Eso es La navaja de Occam.No es necesario iniciar otro proceso.

Rápido y sucio:

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

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 una subcapa de estilo ksh aquí, no estoy totalmente seguro de que funcione en bash.

Eso es lo bueno de Shell, es que puedes usar perl, awk, sed, grep....

Después de mirar un poco a mi alrededor parece tr De hecho, es la forma más sencilla:

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

La navaja de Occam, Supongo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top