仅显示与 grep 匹配的字符串

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 ...行前面都有尾随空格。

Joh*_*024 8

使用 grep

如果您的 grep 支持-Pperl 样式正则表达式的选项:

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

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

使用 sed

sed 可以很好地解决这个问题:

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

使用bash

$ 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)

  • @JamesKo 足够简单:sed 解决方案现在删除了前导空格。(我之前没有解决这个问题,因为你的例子都没有显示前导空格。) (2认同)

Jah*_*hid 5

这会做:

grep -o pattern file
Run Code Online (Sandbox Code Playgroud)

-o仅用于匹配。


你的正则表达式不会做你想做的事。使用 Perl 正则表达式代替:

grep -oP "(?<=\bnew VideoInfo\().*?(?=,)" file
Run Code Online (Sandbox Code Playgroud)

(?<=pattern)islook Behind 和(?=pattern)islookforward,两者都被排除在 中的匹配字符串中grep


Avi*_*Raj 5

您需要使用-oonly-matching)和-PPerl-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)