Jam*_* Ko 5 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]
Run Code Online (Sandbox Code Playgroud)
我有以下正则表达式模式来匹配第一个数字:
grep "new VideoInfo(.*," VideoInfo.cs
Run Code Online (Sandbox Code Playgroud)
问题是,grep 发出匹配的整行,而不仅仅是6 13 17 ....
我怎样才能让它只回显匹配的结果?
编辑:我在每new VideoInfo ...行前面都有尾随空格。
如果您的 grep 支持-Pperl 样式正则表达式的选项:
$ grep -oP '(?<=new VideoInfo\()[^,]*' file
6
13
17
Run Code Online (Sandbox Code Playgroud)
(?<=pattern)是一个向后看。因此,上述内容在正则表达式上匹配[^,]*,但前提是该正则表达式前面带有new VideoInfo\(.
sed 可以很好地解决这个问题:
$ sed -nr 's/[[:space:]]*new VideoInfo\(([^,]*),.*/\1/p' file
6
13
17
Run Code Online (Sandbox Code Playgroud)
$ re='new VideoInfo\(([^,]*)'
$ while read -r line; do [[ $line =~ $re ]] && echo "${BASH_REMATCH[1]}"; done< file
6
13
17
Run Code Online (Sandbox Code Playgroud)
这会做:
grep -o pattern file
Run Code Online (Sandbox Code Playgroud)
-o仅用于匹配。
grep -oP "(?<=\bnew VideoInfo\().*?(?=,)" file
Run Code Online (Sandbox Code Playgroud)
(?<=pattern)islook Behind 和(?=pattern)islookforward,两者都被排除在 中的匹配字符串中grep。
您需要使用-o(only-matching)和-P(Perl-regexp)参数。
grep -oP '\bnew VideoInfo\(\K\d+' VideoInfo.cs
Run Code Online (Sandbox Code Playgroud)
\b称为单词边界,它在单词字符和非单词字符之间进行匹配。(反之亦然)。\K与正向回顾相同,其中回顾不支持任何量词,但\K支持。即,我们可以使用foo[^,]*,\K\d+但不能这样做(?<=foo[^,]*,)\d+,因为lookbehinds不允许量词*, ?,+出现在其中(仅限PCRE)。
或者
grep -oP '^\s*new VideoInfo\(\K[^,]*' VideoInfo.cs
Run Code Online (Sandbox Code Playgroud)