【问题标题】:Grep Print Only After Match [duplicate]Grep 仅在匹配后打印 [重复]
【发布时间】:2012-09-22 20:37:34
【问题描述】:

我使用grep 输出这样的列表

/player/ABc12
/player/ABC321
/player/EGF987
/player/egf751

但是我只想给出玩家的名字,例如ABC321EFG987 等...

【问题讨论】:

  • grep 只向您显示包含您找到的内容的行。通常你会使用 awk/sed 来过滤东西,所以你只能得到该行的子部分。

标签: bash grep


【解决方案1】:

开始使用grep

$ grep -oP "/player/\K.*" FILE
ABc12
ABC321
EGF987
egf751

或更短:

$ grep -oP "[^/]/\K.*" FILE
ABc12
ABC321
EGF987
egf751

或者没有-P (pcre) 选项:

$ grep -o '[^/]\+$' FILE
ABc12
ABC321
EGF987
egf751

或者纯bash

$ IFS=/ oIFS=$IFS
$ while read a b c; do echo $c; done < FILE
ABc12
ABC321
EGF987
egf751
$ IFS=$oIFS

【讨论】:

  • 添加了grep -oP更短的解决方案:)
【解决方案2】:

@sputnick 对grep 的想法是正确的,类似的东西实际上是我的首选解决方案。我个人立即想到了一个积极的回顾:

grep -oP '(?<=/player/)\w+' file

但是\K 也可以正常工作。

另一种(稍微短一些)解决方案是sed

sed 's:.*/::' file

【讨论】:

  • sed 表达式对我来说效果更好
【解决方案3】:

停止使用 grep。

$ awk -F/ '$2 == "player" { print $3 }' input.txt
ABc12
ABC321
EGF987
egf751

【讨论】:

    【解决方案4】:

    一种使用GNU grep 的方法和积极的后视:

    grep -oP '(?<=^/player/).*' file.txt
    

    结果:

    ABc12
    ABC321
    EGF987
    egf751
    

    【讨论】: