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

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

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

我努力了

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

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

这是我尝试过的模式

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

答案1

这并没有按照你想象的那样做,它只是偶然起作用:

[^years]+

意思是,匹配任何字符除了 year以及s至少一次。

另外,代替向后看断言,我会使用避开。它的好处是它可以是可变长度的,这样你就可以轻松地匹配AgeHeight

(Age|Height)=\K

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

grep -Po '(Age|Height)=\K\d+'

--

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

答案2

$ echo 'Age=22 years and Height=6 feet' | awk -F'[= ]' '{print $2, $6}'
22 6

答案3

我有一个具有以下表达式类型的文件每行“年龄=22 岁,身高=6 英尺”

有了sed这个-E选项。

sed -E 's/[^[:digit:]]+/ /g;s/^ //' <<< "Age=22 years and Height=6 feet"

或者如果它是一个指向sed它的文件。

sed -E 's/[^[:digit:]]+/ /g;s/^ //' file.txt

添加两者年龄高度到图案。

sed -E 's/^Age=([[:digit:]][^ ]*).*Height=([[:digit:]][^ ]*).*/\1 \2/' file.txt

相关内容