簡體   English   中英

僅顯示與grep匹配的字符串

[英]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

如果你的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

您需要使用-o僅匹配 )和-PPerl-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僅用於比賽。


你的正則表達式不會做你想要的。 改為使用Perl正則表達式:

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

(?<=pattern)看起來后面, (?=pattern)向前看,兩者都被排除在grep匹配的字符串中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM