仅显示与grep匹配的字符串

时间:2015-07-09 00:58:33

标签: regex bash grep match

我有一个我想要匹配的文件,如下所示:

...
new VideoInfo(6, VideoType.Flash, 270, false, AudioType.Mp3, 64, AdaptiveType.None),
new VideoInfo(13, VideoType.Mobile, 0, false, AudioType.Aac, 0, AdaptiveType.None),
new VideoInfo(17, VideoType.Mobile, 144, false, AudioType.Aac, 24, AdaptiveType.None),
... [a few hundred more entries like these]

我有以下正则表达式模式匹配第一个数字:

grep "new VideoInfo(.*," VideoInfo.cs

问题是,grep会发出匹配的整行而不只是6 13 17 ...

如何让它仅回显匹配的结果?

编辑:我在每个new VideoInfo ...行前面都有尾随空格。

3 个答案:

答案 0 :(得分:3)

使用grep

如果你的grep支持perl-style regex的-P选项:

$ grep -oP '(?<=new VideoInfo\()[^,]*' file
6
13
17

(?<=pattern)是一个后卫​​。因此,上述匹配正则表达式[^,]*,但前提是该正则表达式前面有new VideoInfo\(

使用sed

sed很适合这个问题:

$ sed -nr 's/[[:space:]]*new VideoInfo\(([^,]*),.*/\1/p' file
6
13
17

使用bash

$ re='new VideoInfo\(([^,]*)'
$ while read -r line; do [[ $line =~ $re ]] && echo "${BASH_REMATCH[1]}"; done< file
6
13
17

答案 1 :(得分:2)

您需要使用-o仅匹配)和-P Perl-regexp )参数。

grep -oP '\bnew VideoInfo\(\K\d+' VideoInfo.cs

\b称为单词边界,它在单词char和非单词字符之间匹配。(反之亦然)。 \K与积极的后视相同,其中lookbehinds不支持任何量词,但\K确实如此。也就是说,我们可以使用foo[^,]*,\K\d+,但我们无法(?<=foo[^,]*,)\d+,因为lookbehinds不允许量词*?+存在于其中(仅限PCRE)。

grep -oP '^\s*new VideoInfo\(\K[^,]*' VideoInfo.cs

答案 2 :(得分:1)

这样做:

grep -o pattern file

-o仅用于匹配。

<小时/> 你的正则表达式不会做你想要的。请改用Perl正则表达式:

grep -oP "(?<=\bnew VideoInfo\().*?(?=,)" file

(?<=pattern)展望未来,(?=pattern)向前看,两者都排除在grep的匹配字符串中。