Tenemos una lista de nombres de archivos en el archivo a.txt
con 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'