【发布时间】: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*'
【问题讨论】:
我想过滤与内容匹配后的所有内容,并在“。”之后带上第一个值
我有这样的输出:
输出:
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 获得第一个匹配项。
您也可以使用sed 或awk:
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} 部分打印第二个和第三个字段值并以. 连接。
【讨论】:
我达到了预期的输出,它很简单但很有效:
var=$(echo "product: 13.6.0.35_0" | grep -Eo '[[:digit:]]+' | sed -n 1,2p)
echo ${var} | sed 's/ /./g'
【讨论】:
使用内置 read 、参数扩展和大括号进行命令分组的纯 shell 解决方案。
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
【讨论】: