remove caracteres específicos de uma variável usando o bash

93

Eu quero analisar uma variável (no meu caso, é a versão do kit de desenvolvimento) para torná-lo livre ( . ). Se version='2.3.3' , a saída desejada é 233 .

Eu tentei como abaixo, mas requer que . seja substituído por outro caractere me dando 2_3_3 . Estaria bem se tr . '' tivesse funcionado.

  1 VERSION='2.3.3' 
  2 echo "2.3.3" | tr . _
    
por prayagupd 12.12.2013 / 15:51

6 respostas

110

Não há necessidade de executar um programa externo. A manipulação de string do bash pode lidar com isso (também disponível em ksh (onde vem de) e zsh ):

$ VERSION='2.3.3'
$ echo "${VERSION//.}"
233

(Nos manuais desses shells você pode encontrar isso na seção de expansão de parâmetros.)

    
por 12.12.2013 / 16:25
67

Por ordem cronológica:

tr / sed

echo "$VERSION" | tr -d .
echo "$VERSION" | sed 's/\.//g'

csh / tcsh

echo $VERSION:as/.//

Cascas POSIX:

set -f
IFS=.
set -- $VERSION
IFS=
echo "$*"

ksh / zsh / bash / yash (e busybox ash quando construído com ASH_BASH_COMPAT )

echo "${VERSION//.}"

zsh

echo $VERSION:gs/./
    
por 12.12.2013 / 16:38
14

Além das respostas bem-sucedidas já existe. A mesma coisa pode ser obtida com tr , com a opção --delete .

echo "2.3.3" | tr --delete .

Qual será a saída: 233

    
por 14.07.2016 / 05:53
5

você deve tentar com sed

sed 's/\.//g'

    
por 12.12.2013 / 15:57
3

Perl

$ VERSION='2.3.3'                                     
$ perl -pe 's/\.//g' <<< "$VERSION"           
233

Python

$ VERSION='2.3.3'                                     
$ python -c 'import sys;print sys.argv[1].replace(".","")' "$VERSION"
233

Se $VERSION apenas contiver dígitos e pontos, podemos fazer algo ainda mais curto:

$ python -c 'print "'$VERSION'".replace(".","")'
233

(Cuidado, é uma vulnerabilidade de injeção de código, embora se $VERSION contiver qualquer caractere).

AWK

$ VERSION='2.3.3'
$ awk 'BEGIN{gsub(/\./,"",ARGV[1]);print ARGV[1]}' "$VERSION"
233

Ou isto:

$ awk '{gsub(/\./,"")}1' <<< "$VERSION"
233
    
por 04.02.2017 / 20:28
2
echo "$VERSION" | tr -cd [:digit:]

Isso retornaria apenas dígitos, independentemente dos outros caracteres presentes

    
por 16.03.2017 / 10:32