将模式与sed匹配并同时获取整数

时间:2016-11-21 11:09:06

标签: shell awk sed integer pattern-matching

我有一个包含这些行的xml文件(其中包括):

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

我需要:

  1. 确认ENV=之后的文字属于DEV{1..99}
  2. 模式
  3. 从行ENV=DEV6中提取数字(在本例中为6)到某个环境变量
  4. 我知道一些awk和grep,并且可以使用它来获取数字,但我想到了Sed,我告诉匹配模式比awk更好并且花费更少的时间。另外,我担心长长的greps行匹配特定Env =的行的开头。

    我如何用Sed做这件事?我会用更短的线路逃脱吗?

    我是一个新手,阅读了一堆教程和示例,让我的手指扭曲,试图同时做两件事......

5 个答案:

答案 0 :(得分:2)

如果grep正则表达式可用,也可以使用pcre

$ 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匹配整行
  • -o仅输出匹配的文字
  • -P使用pcre regex
  • Env=DEV\K匹配Env=DEV但不属于输出
  • [1-9][0-9]?范围199

答案 1 :(得分:1)

我建议使用GNU sed:

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

输出:

6

答案 2 :(得分:1)

您可以将sed用作

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

您可以在export命令中直接使用上述命令

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

(或)与perl

非常直截了当
$ perl -nle 'print $1 if /Env=DEV.*?(\d+)/' file
6

答案 3 :(得分:1)

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

输入:

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

输出:

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

将其存储到任何变量中:

var=$(awk command)

答案 4 :(得分:1)

在awk中。首先是一些测试用例:

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