2010-05-24 20 views
6

Estoy tratando de quitar la versión del nombre de un paquete usando solo Bash. Tengo una solución pero no creo que sea la mejor disponible, por lo que me gustaría saber si hay una mejor manera de hacerlo. por mejor quiero decir más limpio, más fácil de entender.versión de tira desde el nombre del paquete usando Bash

supongamos que tengo la cadena "my-program-1.0" y solo quiero "mi-programa". mi solución actual es:

#!/bin/bash 

PROGRAM_FULL="my-program-1.0" 
INDEX_OF_LAST_CHARACTER=`awk '{print match($0, "[A-Za-z0-9]-[0-9]")} <<< $PROGRAM_FULL` 
PROGRAM_NAME=`cut -c -$INDEX_OF_LAST_CHARACTER <<< $PROGRAM_FULL` 

realidad, el "nombre del paquete" sintaxis es un nombre de archivo RPM, si importa.

gracias!

+1

¿qué tal plazo se pensaba 'sed "s/[-0-9.] * $ // "'? – BCS

+0

@BCS: O algo un poco más cuidadoso; el tuyo coincide con 'program-name-3 ... 4--789', por ejemplo, o más realista, contra' program-name2-1.0' (borrando incorrectamente el 2 también). – Cascabel

+0

Tenga en cuenta que la versión * puede * tener letras también. –

Respuesta

7

Pretty bien adaptado a sed:

# Using your matching criterion (first hyphen with a number after it 
PROGRAM_NAME=$(echo "$PROGRAM_FULL" | sed 's/-[0-9].*//') 

# Using a stronger match 
PROGRAM_NAME=$(echo "$PROGRAM_FULL" | sed 's/-[0-9]\+\(\.[0-9]\+\)*$//') 

El segundo partido asegura que el número de versión es una secuencia de números separados por puntos (por ejemplo, X, XX, XXX, ...).

Editar: Por lo tanto, hay comentarios en todas partes sobre la base de que la noción de número de versión no está muy bien definida. Tendrá que escribir una expresión regular para la entrada que espera. Esperemos que no tenga nada tan horrible como "program-name-1.2.3-a". Sin embargo, a falta de una solicitud adicional del OP, creo que todas las respuestas aquí son lo suficientemente buenas.

+0

Podría querer probar la segunda versión. ;-) –

+0

@Jon Ericson: lo hice. Funciona como se esperaba para 'name-X',' name-XX', 'name-X.X',' name-X.X.X', y varias otras permutaciones. Se niega a reemplazar cualquier cosa que no sea un número de versión con el formato correcto, como 'nombre-X'. ¿No es ese el comportamiento deseado? – Cascabel

+0

En mi caja: '$ echo my-program-1.0 | sed 's/- [0-9] \ + \ (\. [0-9] \ + \) * $ //' 'produce' mi-programa-1.0' De acuerdo con la documentación, sed no admite la sintaxis '+'. –

1

Cómo sobre: ​​

$ echo my-program-1.0 | perl -pne 's/-[0-9]+(\.[0-9]+)+$//' 
my-program 
+0

Detalles difíciles: esto coincidirá con 'program-.' pero no' program-1.2.3'. – Cascabel

+0

@Jefromi: No más. ;-) La sintaxis de RE de Perl se ve mucho mejor. –

+0

Sí, perl >> sed. Solo estaba tratando de mantener las cosas simples ... +1. – Cascabel

2

Bash:

program_full="my-program-1.0" 
program_name=${program_full%-*} # remove the last hyphen and everything after 

Produce "mi-programa"

O

program_full="alsa-lib-1.0.17-1.el5.i386.rpm" 
program_name=${program_full%%-[0-9]*} # remove the first hyphen followed by a digit and everything after 

Produce "alsa-lib"

+0

El primero es correcto, ya que aprovecha el hecho de que la versión nunca puede tener un guión. El segundo no es porque algunas partes del nombre pueden comenzar con un dígito. –

+0

@Ignacio: Es cierto, tendría que ser un nombre como "abc-2def-1.0.42-2.foo.i286.rpm" que se convertiría incorrectamente en "abc". –

Cuestiones relacionadas