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.
Nota para el lector: Si tiene problemas para hacer esto, revise su shebang para ver si está llamando a bash o sh, y cómo interpreta su sistema 'sh'. –
A partir de Bash 4, también puede hacer modificaciones de casos. 'minúsculas = $ {CLEAN ,,}' [Bash Hackers Wiki] (http: //wiki.bash-hackers.org/syntax/pe) explica las expansiones de parámetros en una forma * más legible para los humanos que las páginas man. – toxalot
Buen trabajo. No estaba al tanto de estas características de shell. ¡Gracias! Acabo de descubrir que zsh le permite anidar * realmente todo esto, para que pueda hacerlo en una sola línea: 'echo -n $ {$ {$ {str // _ /} ///_} // [^ a-zA-Z0-9 _] /} | tr A-Z a-z' ..no recomiendo poner algo incomprensible en un script. :) (editar: formato) –