我有一个我想要匹配的文件,如下所示:
...
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 ...
行前面都有尾随空格。
答案 0 :(得分:3)
如果你的grep支持perl-style regex的-P
选项:
$ grep -oP '(?<=new VideoInfo\()[^,]*' file
6
13
17
(?<=pattern)
是一个后卫。因此,上述匹配正则表达式[^,]*
,但前提是该正则表达式前面有new VideoInfo\(
。
sed很适合这个问题:
$ sed -nr 's/[[:space:]]*new VideoInfo\(([^,]*),.*/\1/p' file
6
13
17
$ 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
仅用于匹配。
grep -oP "(?<=\bnew VideoInfo\().*?(?=,)" file
(?<=pattern)
展望未来,(?=pattern)
向前看,两者都排除在grep
的匹配字符串中。