Extrahieren Sie die Versionszeichenfolge aus dem Dateinamen

Extrahieren Sie die Versionszeichenfolge aus dem Dateinamen

Wir haben eine Liste von Dateinamen in der Datei a.txt, in die die Versionszeichenfolge eingebettet ist. Beispiel:

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

Wir haben es versucht cat a.txt | tr -d "[:alpha:]-_" | less, aber es sieht nicht richtig aus.

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

Jede Hilfe wird geschätzt.

Antwort1

Es ist nicht möglich, alle diese Zeichenfolgen, wie Sie sie aufgelistet haben, perfekt abzugleichen, da es keine Möglichkeit gibt, den Unterschied zwischen etwas wie „orai18n-“ und „-se2.0“ zu erkennen. Wenn Sie einen regulären Ausdruck erstellen, der nach Zeichenfolgen aus Ziffern und Punkten sucht, die mit einem Bindestrich beginnen, werden Sie alle Zeichenfolgen außer der Zeichenfolge „java-se2.0“ ziemlich gut abgleichen:

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

(Abhängig von Ihrer Version können Sie sed -r verwenden, um die Verwendung von [0-9.]+ zuzulassen.)

Das Ergebnis ist eine Ausgabe, bei der alle erkannten Versionen extrahiert und der gesamte String angezeigt wird, wenn nichts Passendes gefunden wird:

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

Antwort2

Sie können Folgendes verwenden grep:

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

Dadurch werden alle Versionsnummern extrahiert. Wenn eine Zeile keine Version enthält (z. B. javax.annotation), wird nichts gedruckt.

Derregulärer Ausdruck:

  • (?<=-): zuerst nach einem Bindestrich () suchen -, dieser sollte aber nicht Teil der Übereinstimmung sein
  • [0-9]+: Suche nach Zahlen, diese müssen mindestens einmal oder mehrmals vorkommen
  • ([0-9]+\.?)+: Der Punkt ( .) kann vorhanden sein oder nicht, und alles muss mindestens einmal vorkommen.

Antwort3

Sie können das folgende kleine Skript ausprobieren:

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

verwandte Informationen