【问题标题】:Extract number from a line with awk/sed使用 awk/sed 从一行中提取数字
【发布时间】:2013-04-16 13:34:58
【问题描述】:

我有这个字符串:

Stream #0:0: Video: vp6f, yuv420p, 852x478, 1638 kb/s, 25 tbr, 1k tbn, 1k tbc

我想从中提取25。 我用:

sed -r 's/.+([0-9]{2} tbr).+/\1/'

它会返回我需要的东西。

无论如何,如果我遇到像

这样的字符串
Stream #0:0(eng): Video: mpeg4 (Simple Profile) (mp4v / 0x7634706D), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 11981 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 30k tbc

它不再返回我需要的东西。

我尝试了不同的替代方法,因此在两种情况下都会返回 tbr 的值,但找不到正确的表达式。

【问题讨论】:

    标签: regex linux sed awk


    【解决方案1】:

    这是awk 的一种方法:

    $ awk '/tbr/{print $1}' RS=, file
    25
    29.97
    

    说明:

    默认情况下awk 将每一行视为一条记录,通过将RS 设置为,,我们将记录分隔符设置为逗号。该脚本查看每条记录并打印与tbr 匹配的任何记录的第一个字段。


    使用positive lookaheadGNU grep 方法:

    $ grep -Po '[0-9.]+(?= tbr)' file
    25
    29.97
    

    【讨论】:

    • 非常简单!如果您能“翻译”我 RS= 的内容,我将不胜感激,因为我似乎无法理解。
    • @AlexFlo 添加了解释。
    【解决方案2】:

    如果您稍微调整一下正则表达式,您当前的 sed 命令会运行良好:

    sed -r 's/.+ (\S+) tbr,.+/\1/'
    

    【讨论】:

    • 感谢 sudo_O,我似乎从来不记得使用这些:/ 答案已更新。
    猜你喜欢
    • 2011-07-05
    • 1970-01-01
    • 2016-06-01
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2018-08-23
    • 2020-09-26
    相关资源
    最近更新 更多