[英]Display only matched string with grep
我有一個我想要匹配的文件,如下所示:
...
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 ...
行前面都有尾隨空格。
如果你的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
您需要使用-o
( 僅匹配 )和-P
( Perl-regexp )參數。
grep -oP '\bnew VideoInfo\(\K\d+' VideoInfo.cs
\\b
稱為單詞邊界,它在單詞char和非單詞字符之間匹配。(反之亦然)。 \\K
與正面觀察相同,其中外觀不會支持任何量詞,但是\\K
確實如此。 即,我們可以使用foo[^,]*,\\K\\d+
但是我們不能做(?<=foo[^,]*,)\\d+
因為lookbehinds將不允許量詞*
, ?
, +
存在於其中(僅限PCRE)。
要么
grep -oP '^\s*new VideoInfo\(\K[^,]*' VideoInfo.cs
這樣做:
grep -o pattern file
-o
僅用於比賽。
grep -oP "(?<=\\bnew VideoInfo\\().*?(?=,)" file
(?<=pattern)
看起來后面, (?=pattern)
向前看,兩者都被排除在grep
匹配的字符串中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.