eliminar caracteres particulares de una variable usando bash

123

Quiero analizar una variable (en mi caso, es la versión del kit de desarrollo) para que esté .libre de puntos ( ). Si version='2.3.3', la salida deseada es 233.

Lo intenté como a continuación, pero requiere .ser reemplazado por otro personaje que me dé 2_3_3. Hubiera estado bien si tr . ''hubiera funcionado.

  1 VERSION='2.3.3' 
  2 echo "2.3.3" | tr . _
prayagupd
fuente
10
No, no requiere: echo "2.3.3" | tr -d ..
manatwork
1
@manatwork Genial, eso funciona. Puedes publicarlo como respuesta. Gracias
prayagupd
1
Muchas buenas respuestas. Pero si puedo adivinar el objetivo, tenga cuidado con 2.11.3 y 2.1.13 ... ;-) Considere agregar ceros de relleno a los números.
Rmano
1
@Rmano ¿Quieres decir algo así VERSION='2.30.3100'? No importa lo que acaba de .eliminar con todas las respuestas aquí.
prayagupd
2
@PrayagUpd --- Simplemente quise decir que si usará el número después de la conversión para las comparaciones (como para decir si "esta versión es más nueva o la misma"), debería ocuparse de casos como 2.11.3 y 2.1.13 - - Parecen lo mismo después de la eliminación de puntos, pero claramente 2.11.3 es más nuevo. Además, 2.11.3 es más reciente que 2.1.14, pero comparar 2113 y 2114 dará lugar a una respuesta incorrecta. Recuerdo un error en alguna parte para esto ...
Rmano

Respuestas:

136

No hay necesidad de ejecutar un programa externo. bashLa manipulación de cadenas puede manejarlo (también disponible en ksh(de dónde viene) y zsh):

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

(En los manuales de esos shells puede encontrar esto en la sección de expansión de parámetros).

hombre trabajando
fuente
19
Para más detalles, la sintaxis de la respuesta anterior es ${string//substring/replacement}, donde aparentemente la falta de la barra diagonal final y la cadena de reemplazo se interpretan como eliminar . Ver aquí .
sherrellbc
55
Derecho, man bashlo dice claramente en el Shell de parámetros de expansión sección: “ ${parameter/pattern/string}(...) Si la cadena es nula, coincidencias de patrón se eliminan y el /siguiente patrón . Pueden omitirse”
manatwork
1
Mi problema fue que el número de versión vino así "1.0.0"y quería solo el número, así que siga lo que @manatwork sugirió que cambié: "${VERSIONNUM//'"'}"sin embargo, inserto incluso ' ' porque de lo contrario no reconocería la ""cadena similar para despegar.
Alexiscanny
1
@ Alexiscanny, ¿quieres decir que literal "está presente en el valor? Me temo que esto cuenta como una nueva pregunta, pero trate de escapar de la cita doble: "${VERSIONNUM//\"}" pastebin.com/3ECDtkwH
manatwork
1
¡¡Soberbio!! funciona -ashtambién!
Fr0zenFyr
88

Por orden cronológico:

tr / sed

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

csh / tcsh

echo $VERSION:as/.//

Conchas POSIX:

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

ksh / zsh / bash / yash (y busybox ashcuando se construye con ASH_BASH_COMPAT)

echo "${VERSION//.}"

zsh

echo $VERSION:gs/./
Stéphane Chazelas
fuente
1
tr -d eliminó incluso un solo carácter del conjunto. Para Ex, quiero eliminar DCC_ de "DCC_VersionD", elimina DCC y D. Salida esperada: VersiónD. Salida real: versión. sed funcionó a las mil maravillas. :) Gracias por la publicacion.
kayle
20

Además de las respuestas exitosas ya existe. Lo mismo se puede lograr con tr, con la --deleteopción.

echo "2.3.3" | tr --delete .

Lo que dará salida: 233

daz
fuente
66
macos en el --deleteque no se reconoce bandera, pero se puede utilizar -den su lugar
Anentropic
6

usted debe tratar con el sedlugar

sed 's/\.//g'

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

Eso devolvería solo dígitos, sin importar qué otros caracteres estén presentes

usuario2796674
fuente
4

Perl

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

Pitón

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

Si $VERSIONsolo contiene dígitos y puntos, podemos hacer algo aún más corto:

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

(cuidado, es una vulnerabilidad de inyección de código si $VERSIONpuede contener algún carácter).

AWK

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

O esto:

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