Pergunta

Eu estou procurando a melhor maneira de dar uma entrada simples:

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

e limpá-lo, removendo caracteres não alfanuméricos, inferior (caso), e substituindo os espaços com sublinhados.

importa fim

Does? É tr o melhor / única maneira de fazer isso?

Foi útil?

Solução

Como dj_segfault pontos fora, o shell pode fazer a maior parte deste para você. Parece que você vai ter que cair para trás em algo externo para baixo invólucro da cadeia, no entanto. Para isso, você tem muitas opções, como o perl one-liners acima, etc., mas acho que tr é provavelmente o mais simples.

# 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`

A ordem aqui é um pouco importante. Queremos livrar-se sublinhados, além de substituir os espaços por sublinhados, por isso temos de ter a certeza de sublinhados tira primeiro. Ao esperar para passar as coisas para tr até o fim, sabemos que temos apenas alfanuméricos e sublinhados, e podemos ter certeza de que não temos espaços, de modo que não precisa se preocupar com caracteres especiais está sendo interpretado pelo shell.

Outras dicas

Bash pode fazer tudo isso, por si própria, muito obrigado. Se você olhar para a seção da página de homem na Parâmetro Expansão , você vai ver que que o bash foi construído com substituições, substring, guarnição, RTrim, etc.

Para eliminar todos os caracteres não alfanuméricos, faça

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

Isso é navalha de Occam. Não há necessidade de lançar um outro processo.

rápido e sujo:

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

Você pode executá-lo através perl.

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

Eu estou usando ksh-style subnível aqui, eu não estou totalmente certo de que ele funciona em bash.

Essa é a coisa agradável sobre shell, é que você pode usar Perl, awk, sed, grep ....

Depois de um pouco de olhar ao redor, parece tr é realmente a maneira mais simples:

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

Navalha de Occam , suponho.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top