【发布时间】:2012-09-22 20:37:34
【问题描述】:
我使用grep 输出这样的列表
/player/ABc12
/player/ABC321
/player/EGF987
/player/egf751
但是我只想给出玩家的名字,例如ABC321、EFG987 等...
【问题讨论】:
-
grep 只向您显示包含您找到的内容的行。通常你会使用 awk/sed 来过滤东西,所以你只能得到该行的子部分。
我使用grep 输出这样的列表
/player/ABc12
/player/ABC321
/player/EGF987
/player/egf751
但是我只想给出玩家的名字,例如ABC321、EFG987 等...
【问题讨论】:
开始使用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更短的解决方案:)
@sputnick 对grep 的想法是正确的,类似的东西实际上是我的首选解决方案。我个人立即想到了一个积极的回顾:
grep -oP '(?<=/player/)\w+' file
但是\K 也可以正常工作。
另一种(稍微短一些)解决方案是sed:
sed 's:.*/::' file
【讨论】:
停止使用 grep。
$ awk -F/ '$2 == "player" { print $3 }' input.txt
ABc12
ABC321
EGF987
egf751
【讨论】:
一种使用GNU grep 的方法和积极的后视:
grep -oP '(?<=^/player/).*' file.txt
结果:
ABc12
ABC321
EGF987
egf751
【讨论】: