Извлекать значения из файла эффективно - PullRequest
0 голосов
/ 21 февраля 2019

Допустим, у меня есть этот файл: version.h

#define MAJ_VERSION         1
#define MIN_VERSION         4
#define BLD_VERSION         0

Используя скрипт bash, как извлечь значения в 3 отдельных переменных, таких как $maj==1, $min==4 и $bld==0?

Я попробовал несколько подходов к этому регулярному выражению: s/\_VERSION\s*(\d*)/, который позволяет мне извлекать в каждой строке значение в первой группе совпадений, но мне не удалось найти элегантное решение.

Например, это не работает (а также нужен счетчик для устранения неоднозначности 3 значений):

str=$(cat version.h)
for var in ${str[@]}; do
    echo
    if [[ ${var} =~ (\_VERSION\s*)([0-9]*) ]]; then
        echo "match: '${BASH_REMATCH[1]}'"
        echo "match: '${BASH_REMATCH[2]}'"
    fi
done

Ответы [ 3 ]

0 голосов
/ 21 февраля 2019

Если вы используете bash и GNU sed:

source <(sed -E 's/.*(MAJ|MIN|BLD)_VERSION[[:blank:]]+(.*)/\L\1="\2"/' version.h)

Проверьте содержимое переменной:

$ declare -p maj min bld
declare -- maj="1"
declare -- min="4"
declare -- bld="0"
0 голосов
/ 21 февраля 2019

Если во входном файле значения всегда существуют в указанном порядке:

$ read -r maj min bld < <(awk '{printf "%s ", $3} END{print ""}' file)
$ echo "$maj, $min, $bld"
1, 4, 0

Если во входном файле есть более 3 строк, которые вы показываете нам, настройте awk на:

awk '/^#define.*VERSION/{printf "%s ", $3} END{print ""}' file

Если заказ не предопределен, настройте его еще раз:

awk '/^#define.*VERSION/{sub(/_.*/,"",$2); f[$2]=$3} END{print f["MAJ"], f["MIN"], f["BLD"]}' file

Если есть какие-либо другие проблемы, сообщите ...

0 голосов
/ 21 февраля 2019

Это должно сделать это

 maj=$(grep MAJ_VERSION version.h | awk '{print $3}')
 min=$(grep MIN_VERSION version.h | awk '{print $3}')
 bld=$(grep BLD_VERSION version.h | awk '{print $3}')
...