过滤匹配的内容

Filtering matched content

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

我有这样的输出:

输出:

product: 13.6.0.35_0

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

预计:

13.6

我试过类似的方法:

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

如果需要在当前逻辑下使用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]+).*//p' <<< "product: 13.6.0.35_0"
awk -F'[[:space:].]' '{print "."}' <<< "product: 13.6.0.35_0"

参见online demo

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

awk 命令中,字段分隔符设置为白色 space 和 .-F'[[:space:].]' 并且 {print "."} 部分打印第二个和第三个字段值与 ..

连接

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

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

一个纯粹的 shell 解决方案,使用内置的 read 、参数扩展和用于命令分组的大括号。

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

你也可以使用cut:

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