从文件中检索版本号跟随字符串

Retrieve version number from file follow string

我希望能够从字符串后的文件 (yaml) 中检索版本号 (n.n.n)。

sdk: ">=0.2.4 <3.1.1"
version: ^2.3.1
sdk: flutter
version: 1.0.0+1

sed -n '/version:/p sample.yaml

其中 return 提供的字符串行“版本:”,然后我将其通过管道传输到另一个命令 grep 以模式匹配版本号的行:

sed -n '/version:/p sample.yaml | grep -oP '(\[0-9\]+).(\[0-9\]+).(\[0-9\]+)'

我想看看是否有更有效的方法来执行此操作,如果示例中的字符串 = 'sdk' returned 值 return 都是当我想要 return 单个值。

使用awk

awk '/version:/ { 
    pos=match(, /[0-9]+\.[0-9]+\.[0-9]+/);
    print substr(, pos, RLENGTH); }' sample.yaml

match() returns 在字段中找到正则表达式的位置,并将 RLENGTH 设置为它的长度。

你可以使用

sed -nE 's/.*version:[^0-9]*([0-9][0-9.]*).*//p' file
grep -oP 'version:\D*\K\d[\d.]*' file

看到一个 online demo:

#!/bin/bash
s='sdk: ">=0.2.4 <3.1.1"
version: ^2.3.1
sdk: flutter
version 1.0.0+1'
sed -nE 's/.*version:[^0-9]*([0-9][0-9.]*).*//p' <<< "$s"
# => 2.3.1
grep -oP 'version:\D*\K\d[\d.]*' <<< "$s"
# => 2.3.1

version:\D*\K\d[\d.]* grep 正则表达式匹配 version: 子字符串,然后是任何零个或多个 non-digits (与 \D*),然后省略匹配的文本(\K),然后匹配 returns 一个数字,然后是任何零个或多个数字或点(\d[\d.]*)。

sed POSIX ERE(参见 -E 启用此正则表达式风格的选项)模式匹配

  • .* - 任何文本
  • version: - 固定子串
  • [^0-9]* - 零个或多个 non-digits
  • ([0-9][0-9.]*) - 第 1 组 (</code>):一个数字,然后是零个或多个数字或点</li> <li><code>.* - 任何文本。

整个匹配被第 1 组值替换,p 标志打印成功替换的结果(-n 抑制默认行输出)。