У нас есть список имен файлов в файле 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'