Extraire la chaîne de version du nom de fichier


2

Nous avons une liste de noms de fichiers dans le fichier a.txt avec leur chaîne de version incorporée dans eux. Par exemple:

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

Nous avons essayé cat a.txt | tr -d "[:alpha:]-_" | less, mais ça ne semble pas correct.

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

Toute aide est appréciée.

Réponses:


2

Il n'est pas possible de faire correspondre parfaitement toutes ces chaînes car vous les avez énumérées car il est impossible de faire la différence entre quelque chose comme "orai18n-" et "-se2.0". Si vous créez une regex qui recherche des chaînes de chiffres et de points commençant par un tiret, vous ferez bien correspondre toutes les chaînes sauf la chaîne "java-se2.0":

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

(Selon votre version, vous pouvez utiliser sed -r pour autoriser l'utilisation de [0-9.] +)

Cela produit une sortie où toutes les versions reconnues sont extraites et la chaîne entière affichée où rien de approprié n'est trouvé:

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

2

Vous pouvez utiliser grep:

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

Cela extrait tous les numéros de version. Si une ligne ne contient pas de version (par exemple javax.annotation ) rien n'est imprimé.

le regex :

  • (?<=-): cherchez d'abord un tiret ( - ), mais cela ne devrait pas faire partie du match
  • [0-9]+: rechercher des numéros, ils doivent apparaître au moins une ou plusieurs fois
  • ([0-9]+\.?)+: at point ( . ) peut être présent ou non, et tout ce qui doit se produire au moins une fois.

Bonjour Chaos, merci d'avoir répondu. Il y a un léger problème.
chz

Il y a quelques cas où la chaîne de version a le dernier "." par exemple "4.2.0." ; nous l'avons envoyé à sed 's /\.$// g' pour obtenir 4.2.0
chz

Bonjour chaos, comment pouvons-nous grep le nom du fichier sans la version du fichier dans chaque chaîne?
chz

0

Vous pouvez essayer le petit script ci-dessous:

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

5
Votre message doit être élargi. Un bien réponse comprend des instructions spécifiques (pas seulement des liens vers celles-ci) et une explication sur la manière ou la raison pour laquelle la réponse aborde la question des PO. Veuillez modifier votre message pour ajouter des détails expliquant comment votre solution répond à la question des PO.
Twisty Impersonator
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.