Temos uma lista de nomes de arquivos a.txt
com 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'