如何在grep中显示匹配模式的一部分?

时间:2014-04-08 05:42:31

标签: regex perl grep

我想从“abc_12_1”这样的文字中提取12。我正在尝试这样

echo "abc_12_1" | grep -Eo '[a-zA-Z]+_[0-9]+_1'
abc_12_1

但是我无法在字符串中的第一个_之后选择数字,上面命令的输出是整个字符串。我正在寻找grep中的一些替代品,我在跟随Perl模式匹配。

perl -e '"abc_55_1" =~ m/[a-zA-Z]+_([0-9]+)_1/ ; print $1'
55

是否可以使用grep?

3 个答案:

答案 0 :(得分:3)

使用perl

$ echo "abc_12_1" | perl -lne 'print /_(\d+)_/'
12

grep

$ echo "abc_12_1" | grep -oP '(?<=_)\d+(?=_)'
12

答案 1 :(得分:2)

您可以使用cut

cut -d_ -f2 <<< "abc_12_1"

使用grep

grep -oP '(?<=_).*?(?=_)' <<< "abc_12_1"

两者都会产生12

答案 2 :(得分:1)

一种方法是使用awk

echo "abc_12_1" | awk -F_ '{print $2}'
12

grep

echo "abc_12_1" | grep -o "[0-9][0-9]"
12

grep与扩展的正则表达式一起使用

grep -oE "[0-9]{2}"     # Get only hits with two digits
grep -oE "[0-9]{2,}"    # Get hits with two or more digits