【问题标题】:Grep using a regular expression and capturing using groups使用正则表达式进行 Grep 并使用组进行捕获
【发布时间】:2019-10-16 19:02:26
【问题描述】:

我有多个包含以下行的文本文件: """版本:3.4.0.0 xxx xxx xxx""" 我正在尝试从每个文本文件中捕获 3.4.0.0 并显示在终端上。 我写的命令是这样的:

grep -m1 'Version[\s\S]*?(\d[\s\S]+?)\n' *.txt

grep -m1 'Version[\s\S]*?(\d[\s\S]+?)\n' *.txt

我无法使用上述代码获得任何结果。有人可以帮助我吗?

【问题讨论】:

    标签: linux terminal grep


    【解决方案1】:

    您的模式是符合 PCRE 的正则表达式,[\s\S] 匹配 PCRE 模式中的任何字符,但与您与 grep 一起使用的 POSIX BRE 正则表达式风格不匹配,因为您没有使用-P 选项。

    如果你想用 GNU grep 来做

    grep  -oPm 1 'Version\s*:\s*\K\d+(?:\.\d+)+' *.txt
    

    this online demo

    详情

    • Version - Version 字符串
    • \s*:\s* - 用 0+ 个空格括起来的冒号
    • \K - 匹配重置运算符
    • \d+ - 1+ 位,然后
    • (?:\.\d+)+ - . 和 1 位以上的数字重复 1 次或多次。

    您可以使用awk

    awk '/^Version : [0-9]+/{print $3; exit}' *.txt
    

    online awk demo

    s="Text
    Version : 3.4.0.0 xxx xxx xxx
    More text
    Version : 5.6.0.0 xxx xxx xxx"
    awk '/^Version : [0-9]+/{print $3; exit}' <<< "$s"
    # => 3.4.0.0
    

    详情

    • ^Version : [0-9]+ 查找以 Version : &lt;1 or more digits&gt; 开头的行
    • {print $3; exit} 输出字段 3 的值并停止处理,只为您提供第一个匹配项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-07
      • 1970-01-01
      • 2017-07-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多