提取两个字符串模式之间的数字

use*_*623 1 scripting awk shell-script numeric-data

我在每一行“年龄= 22 岁,身高= 6 英尺”中有一个具有以下表达式类型的文件,我只想提取年龄和身高数字。

我试过了

grep -oP  '(?<=Age=)[^years]+' $f | awk '{ printf "%d \n",$1; }
Run Code Online (Sandbox Code Playgroud)

并正确获取年龄。我怎样才能得到年龄和身高。当我尝试嵌套模式匹配时,我只得到高度。

这是我试过的模式

grep -oP  '(?<=Age=)[^years]+.+(?<=Height=)[^feet]+' $f | awk '{ printf "%d \n",$1; }
Run Code Online (Sandbox Code Playgroud)

pLu*_*umo 7

这不是在做你认为它做的事情,它只是偶然地起作用:

[^years]+
Run Code Online (Sandbox Code Playgroud)

这意味着,匹配任何字符除外 years至少一次。

另外,我会使用keep-out来代替Look-behind断言。它的好处是它可以是可变长度,然后您可以轻松匹配和。AgeHeight

(Age|Height)=\K
Run Code Online (Sandbox Code Playgroud)

然后,不要进行负匹配,而是使用正匹配,只匹配数字:

grep -Po '(Age|Height)=\K\d+'
Run Code Online (Sandbox Code Playgroud)

——

$ echo "Age=22 and Height=6" | grep -Po '(Age|Height)=\K\d+'
22
6
Run Code Online (Sandbox Code Playgroud)