Matching a pattern with sed and getting an integer

2019-09-04 19:58发布

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...

5条回答
smile是对你的礼貌
2楼-- · 2019-09-04 20:32
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)
查看更多
何必那么认真
3楼-- · 2019-09-04 20:35

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
查看更多
何必那么认真
4楼-- · 2019-09-04 20:45

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
查看更多
等我变得足够好
5楼-- · 2019-09-04 20:51

I suggest with GNU sed:

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

Output:

6
查看更多
干净又极端
6楼-- · 2019-09-04 20:53

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
查看更多
登录 后发表回答