Извлечь только часть версии имени пакета с помощью bash

IMHO было бы более естественно использовать пустую строку в качестве разделителя записей. В этом «режиме абзаца» awk включает символы новой строки в качестве разделителей полей, поэтому в вашем случае каждая строка записи становится полем. Затем вы можете удалить первое поле, присвоив ему пустую строку; у этого есть хороший побочный эффект переоценки всей записи с заданным разделителем выходных полей: при установке этого значения также на пустую строку, остальные поля объединяются. Затем вы можете просто распечатать длину записи.

awk 'BEGIN {RS="";OFS=""} NR==1 {$1=""; print length}' species_gene

Тестирование с заданными вами входными данными

$ awk 'BEGIN {RS="";OFS=""} NR==1 {$1=""; print length}' species_gene
160
2
23.01.2017, 19:50
4 ответа

Это не очень переносимо, но для этого конкретного случая работает grep :

echo $var | egrep -o '[0-9].*-[0-9]'
1.2.6-6
6
27.01.2020, 21:50

Как сказал триг, , если вы извлекаете значения в той же системе, где установлены эти пакеты, вы можете запросить RPM для версия напрямую:

ver=$(rpm --queryformat="%{VERSION}" -q nfs-utils)
5
27.01.2020, 21:50

Используя только мощность bash, это лучшее, что я нашел до сих пор:

varnums=$(echo ${var//[^0-9]/ })
var_version=${varnums// /.}
echo $varversion 

Результат будет примерно таким:

1.2.6.6.17.686

Не так уж плохо, не так ли?

0
27.01.2020, 21:50

Последние 2 символа '-' окружают версию.

Таким образом, можно написать *RE, привязанный к концу строки с помощью '$'

Например.

$ echo nfs-utils-1.2.6-6.fc17.i686.rpm | sed -e 's,.*-\([^-]*\)-[^-]*$,\1,'

1.2.6

0
27.01.2020, 21:50

Теги

Похожие вопросы