Matching a pattern with sed and getting an integer

2019-09-04 20:25发布

问题:

I have an xml file with these lines (among others):

#Env=DEV2,DEV3,DEV5,DEV6
#Enter your required DEV environment after the ENV= in the next line: 
Env=DEV6

I need to:

  1. Verify that the text after ENV= is of the pattern DEV{1..99}
  2. extract the number (in this case, 6) from the line ENV=DEV6 to some environment variable

I know a bit of awk and grep, and can use those to get the number, but I'm thinking of Sed, which I'm told matches patterns nicer than awk and takes less time. Also, I'm concerned about long long lines of greps matching the beginning of the line for that particular Env= .

How would I go about doing it with Sed? would I get away with a shorter line?

I'm a sed newbie, read a bunch of tutorials and examples and got my fingers twisted trying to do both things at the same time...

回答1:

I suggest with GNU sed:

var=$(sed -nE 's/^Env=DEV([0-9]{1,2})$/\1/p' file)
echo "$var"

Output:

6


回答2:

Can use grep also if pcre regex is available

$ cat ip.txt
#Env=DEV2,DEV3,DEV5,DEV6
#Enter your required DEV environment after the ENV= in the next line: 
Env=DEV6
foo
Env=DEV65
bar
Env=DEV568

$ grep -xoP 'Env=DEV\K[1-9][0-9]?' ip.txt
6
65
  • -x match whole line
  • -o output only matching text
  • -P use pcre regex
  • Env=DEV\K match Env=DEV but not part of output
  • [1-9][0-9]? range of 1 to 99


回答3:

awk -F'Env=DEV' '/Env=DEV[0-9]$|Env=DEV[0-9][0-9]$/{print $2}' input

Input:

echo '
Env=DEV6
Env=DEVasd
Env=DEV62
Env=DEV622'

Output:

awk -F'Env=DEV' '/Env=DEV[0-9]$|Env=DEV[0-9][0-9]$/{print $2}' input
6
62

To store it into any variable:

var=$(awk command)


回答4:

In awk. First some test cases:

$ cat file
foo
Env=DEV0
Env=DEV1
Env=DEV99
Env=DEV100
$ awk 'sub(/^Env=DEV/,"") && /^[1-9][0-9]?$/' file
1
99


回答5:

You can used sed as

$ sed 's/^Env=DEV\([1-9][0-9]\?\)/\1/' file
6

You can directly use the above command in export command as

export YOUR_EXPORT_VARIABLE=$(sed 's/^Env=DEV\([1-9][0-9]\?\)/\1/' file)

(or) its pretty straight forward with perl

$ perl -nle 'print $1 if /Env=DEV.*?(\d+)/' file
6