SasnycoN
SasnycoN

Reputation: 35

How to isolate part of a line of text in order to use it as a variable

I'm creating bash script and want to check version number of program from a line in a file and use it to make different checks and operations.

The version line in file is looking like this (examples):

Program Version 1.3 

or

Program Version 1.3.1

It's on different lines in different versions but always follow the same syntax. How to remove the first part and isolate only the version number in order to put it in a variable?

Upvotes: 0

Views: 739

Answers (6)

SasnycoN
SasnycoN

Reputation: 35

Here is what I have used at the end:

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

I have used find + grep to receive the line with the version that I need and -f in awk to define field separator to be blank space and with that I have separated the version number from the rest of the results. Thank you all for your answers.

Upvotes: 0

user8017719
user8017719

Reputation:

Some possible solutions for the problem:

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

(HTH) Hope This Helps.

Upvotes: 0

codeforester
codeforester

Reputation: 43109

I would just use grep and cut for this, since the pattern is fixed:

# 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

Upvotes: 0

Jonathan Pugh
Jonathan Pugh

Reputation: 30

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

Just finds Program Version then strip it out with sed.

Edit: Sorry misread. Removed version number

Upvotes: 0

Inian
Inian

Reputation: 85895

Using GNU grep with -P for perl-style regEx match, and -o flag to return only the matching pattern.

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

To save it in a variable

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

Use perl regEx itself,

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

in variable,

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

Using GNU sed

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

and

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

Upvotes: 1

OscarAkaElvis
OscarAkaElvis

Reputation: 5724

I guess you obtain that Program Version 1.3.1 for example launching some kind of command. Well, try this:

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

Explanation:

  • You need to launch the command which show the version
  • You redirect the output to egrep which search through all lines matching only which starts ^ <- this is to start string, with the desired text Program Version, and this [0-9] is to match one number. If you don't know if the version can be 1.3 or 1.3.1 or 1 that's all you need.
  • awk is going to "select" the second column (first is "Program version" and second is the version number)

Good luck!

Upvotes: 1

Related Questions