Extraer la cadena de versión del nombre del archivo

Extraer la cadena de versión del nombre del archivo

Tenemos una lista de nombres de archivos en el archivo a.txtcon su cadena de versión incrustada en ellos. P.ej:

gson-2.1
xmlParserAPIs-2.4.0
acrobat-1.1
orai18n-mapping-12.1.0.2
jdbc-se2.0
eclipse-core-runtime-20070801
trove-2.0.1
antisamy-1.3
javax.annotation
dojo-4342
org.json-0.0.1
castor-1.2-jdo

Lo intentamos cat a.txt | tr -d "[:alpha:]-_" | less, pero no parece correcto.

eg
2.1
2.4.0
1.1
1812.1.0.2   <--- wrong
2.0
20070801
2.0.1
1.3
.
4342
.0.0.1
1.        <--- wrong

Se agradece cualquier ayuda.

Respuesta1

No es posible hacer coincidir perfectamente todas esas cadenas tal como las ha enumerado, ya que no hay forma de diferenciar entre algo como "orai18n-" y "-se2.0". Si crea una expresión regular que busca cadenas de dígitos y puntos que comienzan con un guión, coincidirá bastante bien con todas las cadenas menos con "java-se2.0":

sed 's/.*-\([0-9\.][0-9\.]*\).*/\1/'

(Dependiendo de su versión, puede usar sed -r para permitir el uso de [0-9.]+)

Esto produce una salida donde se extraen todas las versiones reconocidas y se muestra la cadena completa donde no se encuentra nada adecuado:

2.1
2.4.0
1.1
12.1.0.2
jdbc-se2.0
20070801
2.0.1
1.3
javax.annotation
4342
0.0.1
1.2

Respuesta2

Puedes usar grep:

grep -oP '(?<=-)([0-9]+\.?)+' a.txt

Eso extrae todos los números de versión. Si una línea no contiene ninguna versión (por ejemplo javax.annotation), no se imprime nada.

Elexpresión regular:

  • (?<=-): primero busque un guión ( -), pero no debería ser parte de la coincidencia
  • [0-9]+: busca números, deben aparecer al menos una o varias veces
  • ([0-9]+\.?)+: en el punto ( .) puede estar presente o no, y todo eso debe ocurrir al menos una vez.

Respuesta3

Puedes probar el pequeño script a continuación:

cat a.txt | sed 's/[-/a-zA-Z]//g'

información relacionada