Extraia a string da versão do nome do arquivo

Extraia a string da versão do nome do arquivo

Temos uma lista de nomes de arquivos a.txtcom a string de versão incorporada neles. Por exemplo:

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

Tentamos cat a.txt | tr -d "[:alpha:]-_" | less, mas não parece certo.

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

Qualquer ajuda é apreciada.

Responder1

Não é possível combinar perfeitamente todas essas strings conforme você as listou, pois não há como saber a diferença entre algo como "orai18n-" e "-se2.0". Se você criar uma regex que procure sequências de dígitos e pontos que começam com um travessão, você corresponderá muito bem a todas, exceto a sequência "java-se2.0":

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

(Dependendo da sua versão, você pode usar sed -r para permitir o uso de [0-9.]+)

Isso produz uma saída onde todas as versões reconhecidas são extraídas e a string inteira é exibida onde nada adequado é encontrado:

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

Responder2

Você pode usar grep:

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

Isso extrai todos os números de versão. Se uma linha não contiver versão (por exemplo javax.annotation), nada será impresso.

Oexpressão regular:

  • (?<=-): primeiro procure um travessão ( -), mas ele não deve fazer parte da correspondência
  • [0-9]+: pesquise números, eles devem aparecer pelo menos uma ou várias vezes
  • ([0-9]+\.?)+: o ponto ( .) pode estar presente ou não, e tudo isso deve ocorrer pelo menos uma vez.

Responder3

Você pode tentar o pequeno script abaixo:

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

informação relacionada