2

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

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

3 ответа3

2

Невозможно точно сопоставить все эти строки, поскольку вы перечислили их, так как невозможно определить разницу между чем-то вроде «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), ничего не печатается.

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .