正则表达式会在特定字符串之后 grep 数字

Bla*_*bbs 12 text-processing regular-expression

所以我有一条线:

ID: 54376
Run Code Online (Sandbox Code Playgroud)

你能帮我做一个只返回没有“ID:”的数字的正则表达式吗?

注意:此字符串位于文件中。

cuo*_*glm 20

尝试这个:

grep -oP '(?<=ID: )[0-9]+' file
Run Code Online (Sandbox Code Playgroud)

或者:

perl -nle 'print $1 if /ID:.*?(\d+)/' file
Run Code Online (Sandbox Code Playgroud)


ter*_*don 6

很多方法可以做到这一点。例如:

  1. 将 GNUgrep与最近的 PCRE 一起使用并匹配以下数字ID:

    grep -oP 'ID:\s*\K\d+' file
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用awk并简单地打印所有以ID:

    awk '/^ID:/{print $NF}' file
    
    Run Code Online (Sandbox Code Playgroud)

    这也将打印不是数字的字段,仅获取数字,并且仅在第二个字段中,使用

    awk '($1=="ID:" && $2~/^[0-9]+$/){print $2}' file
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将 GNU grep 与扩展正则表达式一起使用并解析两次:

    grep -Eo '^ID: *[0-9]+' file | grep -o '[0-9]*'
    
    Run Code Online (Sandbox Code Playgroud)

  • @rnd_d 这是一个 Perl 兼容正则表达式 (PCRE) 构造,这意味着“忽略与此匹配的任何内容”。它就像一个lookbehind一样使用,它让我使用`-o`来只打印匹配的部分但也丢弃我不感兴趣的东西。比较`echo "foobar" | grep -oP "foobar"` 和 `echo "foobar" | grep -oP 'foo\Kbar'` (2认同)

Roh*_*ain 4

使用egrepwith-ogrepwith-Eo选项仅获取匹配的段。使用[0-9]正则表达式来获取数字:

grep -Eo [0-9]+ filename
Run Code Online (Sandbox Code Playgroud)