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

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


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

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


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'


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

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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.