2017-01-11 3 views
0

Я создаю скрипт bash и хочу проверить номер версии программы из строки в файле и использовать ее для выполнения различных проверок и операций.Как изолировать часть строки текста, чтобы использовать ее как переменную

версия строка в файле выглядит следующим образом (примеры):

Program Version 1.3 

или

Program Version 1.3.1 

Это на разных линиях в разных версиях, но всегда тот же синтаксис. Как удалить первую часть и изолировать только номер версии, чтобы поместить ее в переменную?

+0

Вот что я использовал в конце Версия = 'find. -type f -name "filename" -exec grep -h 'Версия программы' {} + | awk -F "" '{print $ 3}' ' – SasnycoN

ответ

1

Использование GNU grep с -P для перл-стиля regEx совпадение, и -o флаг, чтобы вернуть только соответствующий шаблон.

grep -oP 'Program Version \K[^ ]*' file 
1.3.1 

Чтобы сохранить его в переменной

versionNo="$(grep -oP 'Program Version \K[^ ]*' file)" 
printf "%s\n" "$versionNo" 
1.3.1 

Использование perlregEx сам,

perl -lne 'print "$1" if /^Program Version (\d.+)/' file 
1.3.1 

в переменной,

versionNo="$(perl -lne 'print "$1" if /^Program Version (\d.+)/' file)" file 
printf "%s\n" "$versionNo" 
1.3.1 

GNU sed Использование

sed -r 's/Program Version ([[:digit:]].+).*/\1/' file 
1.3.1 

и

versionNo="$(sed -r 's/Program Version ([[:digit:]].+).*/\1/' file)" file 
printf "%s\n" "$versionNo" 
1.3.1 
+0

Фактический пример perl не требует '\ k', поскольку вы печатаете группу захвата. – 123

+0

@ 123: Да, спасибо! – Inian

1

Я думаю, вы получаете, что Program Version 1.3.1, например, запускаете какую-то команду. Ну, попробуйте это:

#!/bin/bash 
version=$(yourCommandWhichShowsVersion 2> /dev/null | egrep "^Program Version [0-9]" | awk '{print $3}') 

Объяснение:

  • Вам нужно запустить команду, которая показывает версию
  • перенаправления в задать расширенные которые поиск по всем линиям, соответствующих только который начинается ^ < - это начало строки с нужным текстом Program Version, и этот [0-9] должен соответствовать одному номеру. Если вы не знаете, может ли версия 1.3 или 1.3.1 или 1, это все, что вам нужно.
  • AWK собирается «выбрать» второй столбец (первый является «Программа версия» и вторым это номер версии)

Успехов!

+1

Существует почти никогда не причина для вывода вывода' grep' на 'awk'. Кроме того, поля пронумерованы от 1 в 'awk', поэтому вы ищете поле 3, а не поле 2.' awk' может фильтровать свой собственный вход. '... | awk '/^Версия программы [0-9]/{print $ 3}' '. – chepner

+0

Возможно, вы правы, и это можно сделать только с awk, но это работает! потому что после «piping» to awk выход имеет только 2 столбца данных, и он работает !! Вторая версия. Я тестировал несколько программ, которые, например, показывали его версию на странице справки, и она работала во всех случаях. Спасибо за совет! :) – OscarAkaElvis

+0

Зачем это _not_ print 'Version'? Почему должны быть только два столбца данных? 'awk '{print $ 2}' <<< 'Версия программы 1'' напечатает' Version', а не '1'. –

0
Value=$(cat program.txt | grep Program\ Version\ | sed "s/Program \Version\ //g") 

Просто находит версию программы, затем вытаскивайте ее с помощью sed.

Редактировать: Sorry misread. Удаленный номер версии

+0

Он сказал, что не знает номер версии ... так что 1.3 не может быть в grep. – OscarAkaElvis

0

я бы просто использовать grep и cut для этого, так как картина фиксируется:

# find the first occurrence of the line (-m 1) starting with the pattern (^) and 
# the third field (cut -f3) is the version 
# this makes sure we ignore 
# a) multiple occurrences of the pattern, if any 
# b) occurrence of "Program Version" anywhere else on a line 
# we make no assumption about the format of the version number 
version=$(grep -m 1 "^Program Version " program.txt | cut -f3 -d' ') 
if [[ -z $version ]]; then 
    # version not specified 
    # your exception handler here 
fi 
0

Некоторые из возможных решений проблемы:

awk '/Program Version/{print $3}' file.txt
grep -oP "Program Version \K[^ ]*" file.txt
sed -n '/Program Version /s///p' file.txt
perl -lane 'if (/Program Version/) {print $F[2]}' file.txt

(НТН) Надеюсь, что это помогает.

0

Вот что я использовал в конце:

Version=`find . -type f -name "filename" -exec grep -h 'Program Version' {} + | awk -F " " '{print $3}'` 

Я использовал находку + Grep, чтобы получить строку с версией, что мне нужно и -f в AWK для определения поля разделителя пустого пространства и с этим я отделил номер версии от остальных результатов. Спасибо всем за ваши ответы.

Смежные вопросы