Извлечь строку версии из имени файла

Извлечь строку версии из имени файла

У нас есть список имен файлов в файле a.txtсо встроенной в них строкой версии. Например:

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

Мы попробовали cat a.txt | tr -d "[:alpha:]-_" | less, но это выглядит неправильно.

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

Любая помощь будет оценена по достоинству.

решение1

Невозможно идеально сопоставить все эти строки, как вы их перечислили, поскольку нет способа определить разницу между чем-то вроде "orai18n-" и "-se2.0". Если вы создадите регулярное выражение, которое ищет строки цифр и точек, начинающиеся с тире, вы сопоставите все, кроме строки "java-se2.0":

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

(В зависимости от вашей версии вы можете использовать sed -r, чтобы разрешить использование [0-9.]+)

Это создает вывод, в котором извлекаются все распознанные версии и отображается вся строка, в которой не найдено ничего подходящего:

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

Вы можете использовать grep:

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

Это извлекает все номера версий. Если строка не содержит версии (например javax.annotation), ничего не печатается.

Theрегулярное выражение:

  • (?<=-): сначала найдите тире ( -), но оно не должно быть частью совпадения
  • [0-9]+: поиск чисел, они должны встречаться как минимум один или несколько раз
  • ([0-9]+\.?)+: точка ( .) может присутствовать или отсутствовать, и все это должно встречаться хотя бы один раз.

решение3

Вы можете попробовать небольшой скрипт ниже:

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

Связанный контент