【问题标题】:Filtering matched content过滤匹配的内容
【发布时间】:2021-10-02 19:05:42
【问题描述】:

我想过滤与内容匹配后的所有内容,并在“。”之后带上第一个值

我有这样的输出:

输出:

product: 13.6.0.35_0

更具体地说,我只需要前两个数字和点后的第一个数字,记住我们不应该拘泥于问题中的值,而应该拘泥于过滤内容的方法。

预期:

13.6

我尝试了类似的方法:

echo "product: 13.6.0.35_0" | grep -ow '\w*13\w*'

【问题讨论】:

    标签: regex sed grep


    【解决方案1】:

    如果需要在当前逻辑下使用grep,可以使用

    echo "product: 13.6.0.35_0" | grep -ow '13\.[0-9]*' | head -1
    

    其中13\.[0-9]* 匹配13. 和零个或多个数字(由于w 选项而作为整个单词)和head -1 获得第一个匹配项。

    您也可以使用sedawk

    sed -En 's/.* ([0-9]+\.[0-9]+).*/\1/p' <<< "product: 13.6.0.35_0"
    awk -F'[[:space:].]' '{print $2"."$3}' <<< "product: 13.6.0.35_0"
    

    请参阅online demo

    sed 命令匹配直到空格的任何文本,然后匹配空格并将随后的两个以点分隔的数字捕获到第 1 组 (\1) 中,然后将行的其余部分匹配并替换为第 1 组打印的值(因为默认行输出被 -n 抑制)。

    awk 命令中,字段分隔符设置为空格,. 设置为-F'[[:space:].]'{print $2"."$3} 部分打印第二个和第三个字段值并以. 连接。

    【讨论】:

      【解决方案2】:

      我达到了预期的输出,它很简单但很有效:

      var=$(echo "product: 13.6.0.35_0" | grep -Eo '[[:digit:]]+' | sed -n 1,2p)
      echo ${var} | sed 's/ /./g'
      

      【讨论】:

        【解决方案3】:

        使用内置 read 、参数扩展和大括号进行命令分组的纯 shell 解决方案。

        echo "product: 13.6.0.35_0" | { read -r _ value; echo "${value%.*.*}" ; }
        

        【讨论】:

          【解决方案4】:

          你也可以使用cut:

           echo 'product: 13.6.0.35_0' | cut -d ' ' -f2 | cut -d '.' -f1-2
           13.6
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-11-15
            • 2012-07-11
            • 2012-03-19
            • 2016-04-19
            • 2011-12-10
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多