Extrai a string de versão do nome do arquivo

2

Temos uma lista de nomes de arquivos no arquivo a.txt com sua string de versão incorporada a eles. 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

Nós 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.

    
por chz 09.06.2015 / 04:34

3 respostas

2

Não é possível combinar perfeitamente todas essas strings como você as listou, já que não há como diferenciar 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 traço, você corresponderá a todas as sequências, exceto à "java-se2.0":

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

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

Isso produz uma saída em que todas as versões reconhecidas são extraídas e toda a sequência 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
    
por 09.06.2015 / 05:28
2

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 nenhuma versão (por exemplo, javax.annotation ), nada será impresso.

O regex :

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

Você pode experimentar o pequeno script abaixo:

cat a.txt | sed 's/[-/a-zA-Z]//g'
    
por 09.06.2015 / 14:24