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

123

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

Eu tentei como abaixo, mas ele precisa .ser substituído por outro personagem que me dê 2_3_3. Teria sido bom se tr . ''tivesse funcionado.

  1 VERSION='2.3.3' 
  2 echo "2.3.3" | tr . _
prayagupd
fonte
10
Não, ele não requer: echo "2.3.3" | tr -d ..
manatwork
1
@manatwork Ótimo, isso funciona. Você pode publicá-lo como resposta. Obrigado
prayagupd
1
Muitas boas respostas. Mas se eu puder adivinhar o objetivo, seja avisado sobre 2.11.3 e 2.1.13 ... ;-) Considere adicionar zeros de preenchimento aos números.
Rmano 12/12
1
@Rmano Você quer dizer algo assim VERSION='2.30.3100'? Não importa o que .são removidos, com todas as respostas aqui.
13 de
2
@PrayagUpd --- Eu simplesmente quis dizer que se você usar o número após a conversão para comparações (como dizer se "esta versão é mais recente ou a mesma"), você deve cuidar de casos como 2.11.3 e 2.1.13 - - eles parecem os mesmos após a remoção dos pontos, mas claramente a 2.11.3 é mais recente. Além disso, 2.11.3 é mais recente que 2.1.14, mas comparar 2113 e 2114 levará à resposta errada. Lembro-me de um erro em algum lugar para isso ...
Rmano

Respostas:

136

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

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

(Nos manuais dessas cápsulas, você pode encontrar isso na seção de expansão de parâmetros.)

homem a trabalhar
fonte
19
Para mais detalhes, a sintaxe da resposta acima é ${string//substring/replacement}onde, aparentemente, a falta da barra final e da seqüência de substituição são interpretadas como exclusão . Veja aqui .
sherrellbc
5
Certo, man bashdiz claramente na Shell Parâmetro Expansão secção: “ ${parameter/pattern/string}(...) Se corda é nulo, jogos de padrão são excluídas ea /seguinte padrão . Pode ser omitido”
manatwork
1
Meu problema era que o número da versão era assim "1.0.0"e eu queria apenas o número, então siga o que o @manatwork sugeriu que eu mudasse: "${VERSIONNUM//'"'}"no entanto, insiro mesmo ' ' porque, caso contrário, ele não reconheceria a ""sequência semelhante para decolar.
Alexiscanny
1
@ Alexiscanny, você quer dizer literal "estão presentes no valor? Receio que esta conta como nova pergunta, mas tenta apenas escapar da aspa dupla: "${VERSIONNUM//\"}" pastebin.com/3ECDtkwH
manatwork
1
Soberbo !! funciona -ashtambém!
precisa saber é o seguinte
88

Por ordem cronológica:

tr / sed

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

csh / tcsh

echo $VERSION:as/.//

Cartuchos POSIX:

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

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

echo "${VERSION//.}"

zsh

echo $VERSION:gs/./
Stéphane Chazelas
fonte
1
tr -d excluiu até um único caractere do conjunto. Para Ex, eu quero excluir DCC_ de "DCC_VersionD", ele exclui DCC e D. Saída esperada: VersionD. Saída real: versão. sed funcionou como um encanto. :) obrigado pelo post.
Kayle
20

Além das respostas bem-sucedidas, já existe. O mesmo pode ser alcançado com tr, com a --deleteopção

echo "2.3.3" | tr --delete .

Qual saída: 233

daz
fonte
6
no MacOS a --deletebandeira não é reconhecido, mas você pode usar -dem vez
Anentropic
6

você deve tentar com sedvez

sed 's/\.//g'

fduff
fonte
4
echo "$VERSION" | tr -cd [:digit:]

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

user2796674
fonte
4

Perl

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

Pitão

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

Se $VERSIONcontiver apenas 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 que $VERSIONpode conter algum caractere).

AWK

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

Ou isto:

$ awk '{gsub(/\./,"")}1' <<< "$VERSION"
233
Sergiy Kolodyazhnyy
fonte