【问题标题】:Extract Values Between Pattern Match在模式匹配之间提取值
【发布时间】:2019-02-25 18:00:24
【问题描述】:
我正在尝试提取文本文件中模式匹配之间的任何数值。
解析的日志文件文本
> GET /pub/data/nccf/com/hiresw/prod/hiresw.20180921/hiresw.t00z.nmmb_2p5km.f25.conus.grib2
我想在 nmmb_2p5km.f25.conus.grib2
中从
f25 中提取
25
尝试的代码
sed -e 's/nmmb_2p5km\(.*\)grib2/\1/'
【问题讨论】:
标签:
regex
parsing
unix
sed
【解决方案1】:
你可以使用
log="GET /pub/data/nccf/com/hiresw/prod/hiresw.20180921/hiresw.t00z.nmmb_2p5km.f25.conus.grib2"
sed 's/.*nmmb_2p5km[^0-9]*\([0-9]*\)[^0-9]*grib2.*/\1/' <<< "$log"
.*nmmb_2p5km[^0-9]*\([0-9]*\)[^0-9]*grib2.* 模式匹配
-
.* - 任何 0+ 个字符
-
nmmb_2p5km - 文字子串
-
[^0-9]* - 0+ 个非数字字符
-
\([0-9]*\) - 捕获组 1(稍后在替换模式中使用 \1 引用):0+ 个数字
-
[^0-9]* - 0+ 个非数字字符
-
grib2.* - grib2 和任何 0+ 个字符。
或者,您可以使用带有 PCRE 模式的 grep,例如
grep -Po 'nmmb_2p5km\D*\K\d+' <<< "$log"
详情
-
nmmb_2p5km - 文字子串
-
\D* - 0+ 个非数字字符
-
\K - 匹配重置操作员丢弃到目前为止匹配的所有文本
-
\d+ - 1 位以上。
请参阅online sed and grep demo。
【解决方案2】:
使用 perl 单行代码
> export log="GET /pub/data/nccf/com/hiresw/prod/hiresw.20180921/hiresw.t00z.nmmb_2p5km.f25.conus.grib2"
> perl -ne ' BEGIN { $x=$ENV{log};$x=~s/(.+?)(\d+)\.conus\.(.+)/\2/g; print "$x\n"; exit } '
25
>