【问题标题】:Extracting group from regex从正则表达式中提取组
【发布时间】:2021-01-28 20:34:01
【问题描述】:

我是使用正则表达式的新手,并且在理解如何从正则表达式中提取组时遇到了一些问题。我有一个文本文件(example.txt):

libstuff-example1 (>= 6.3.2),
libpackage-example2 (>= 5.2.1),
libtest-example3 (>= 5.2.1)

我试图仅从 libpackage 行中提取“5.2.1”并将其放入 bash 脚本的变量中。我试过做

cat example.txt | grep -oP "libpackage-[a-z- (>=]+(.*)[)],"

但它给了我整行而不是“5.2.1”部分。如何从该行中提取第一组,这样我只能得到“5.2.1”?

【问题讨论】:

  • grep 无法访问组。 -o 打印整个匹配。

标签: regex linux bash


【解决方案1】:

你可以使用

val=$(grep -Po 'libpackage-.* \K[0-9.]+' example.txt)

详情

  • -Po - 启用 PCRE 正则表达式引擎 (P) 并仅输出匹配项(使用 o
  • libpackage-.* \K[0-9.]+ - 匹配 libpackage-,然后是任何文本、空格,然后忽略所有匹配的文本,然后匹配并返回一个或多个数字或点。

查看online demo

s='libstuff-example1 (>= 6.3.2),
libpackage-example2 (>= 5.2.1),
libtest-example3 (>= 5.2.1)'

val=$(grep -Po 'libpackage-.* \K[0-9.]+'  <<< "$s")
echo "$val"
# => 5.2.1

GNU awk 方式:

val=$(awk -F'[ ()]+' '/^libpackage-/{print $3}' example.txt)

this online demo

这里,-F'[ ()]+' 将字段分隔符设置为一个或多个空格或括号,/^libpackage-/ 查找以 libpackage- 开头的行,{print $3} 打印(“返回”)字段的值(列) 3.

【讨论】:

    【解决方案2】:

    使用sed

    var=$(sed -nE '/libpackage/s/.* ([0-9.]+).*/\1/p' file)
    
    echo "$var"
    5.2.1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-29
      • 1970-01-01
      • 2017-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多