Matching a pattern with sed and getting an integer out at the same time

浪子不回头ぞ 提交于 2019-12-12 04:29:54

问题


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


来源:https://stackoverflow.com/questions/40718708/matching-a-pattern-with-sed-and-getting-an-integer-out-at-the-same-time

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!