Remove números (tira caracteres numéricos) da variável string

4

Eu quero remover todos os caracteres numéricos de uma variável String, por exemplo, de:

VARIABLE=qwe123rty567

para:

echo $VARIABLE
> qwerty

Eu pesquisei muitos posts mas eles usam sed para gerar nomes de arquivos / arquivos ou saem para ecoar. Eu não consegui trabalhar com isso por causa do espaço em branco:

VARIABLE=$VARIABLE | sed 's/[0-9]*//g'
    
por George 25.11.2015 / 11:37

4 respostas

9

com bash :

$ printf '%s\n' "${VARIABLE//[[:digit:]]/}"
qwerty

[:digit:] pode conter outros caracteres de 0 a 9 dependendo da sua localidade. Se você quiser apenas remover 0 a 9, use C locale.

    
por 25.11.2015 / 11:40
4

Para variedade, aqui estão os métodos usando

tr :

VARIABLE=$(printf '%s' "$VARIABLE" | tr -d '0123456789')

sed :

VARIABLE=$(printf '%s' "$VARIABLE" | sed 's/[0-9]//g')

Expansão do Bash, de longe a mais concisa:

VARIABLE=${VARIABLE//[0-9]/}

e finalmente expansão Bash novamente, desta vez usando a classe de caracter [[:digit:]] .

VARIABLE=${VARIABLE//[[:digit:]]/} 

Note que (como outros apontaram) [[:digit:]] , deve cobrir qualquer coisa definida como um dígito em sua localidade.

    
por 26.11.2015 / 04:04
3
VARIABLE=qwe123rty567
IFS=0123456789
set -f # Disable glob
printf %s $VARIABLE
qwerty

manipulação adicional é possível.

VARIABLE=qwe123rty567
IFS=0123456789
set -f # Disable glob
set -- $VARIABLE
IFS=;   VARIABLE=$*
printf "replaced $# numbers in \$VARIABLE. RESULT:\t%s\n" "$*"
replaced 6 numbers in $VARIABLE. RESULT:    qwerty
    
por 25.11.2015 / 11:39
1

Espaço em branco (na verdade, a falta de cotação de suas variáveis) foi apenas parte do problema.

Você não pode simplesmente canalizar uma variável através de sed , assim, não funciona. Mais precisamente, ele não canaliza o valor de "$ VARIABLE" através de sed , o shell tentará executar o valor de "$ VARIABLE" e canalizar a saída disso através de sed . BTW, isso não é um bug - isso é útil se $ VARIABLE contiver um comando válido como ls ou rsync ou qualquer outra coisa.

Além disso, se você quiser atribuir a saída de um comando ou pipeline a uma variável, será necessário envolver esse comando / pipeline com $() .

Então, para modificar uma variável com sed , você precisa fazer algo assim:

VARIABLE=$(printf '%s' "$VARIABLE" | sed 's/[0-9]*//g')

Você pode usar echo em vez de printf , mas o echo interpretará e agirá em determinadas sequências de caracteres em $ VARIABLE (por exemplo, \t , \n , \r , etc), enquanto printf won t. Você vai se deparar com muitos exemplos usando echo ... substituí-los por printf '%s' , é muito mais seguro.

    
por 25.11.2015 / 23:38