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.
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'
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.
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
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.