sed选择最后一次出现而不是第一次出现

sed选择最后一次出现而不是第一次出现,sed,match,Sed,Match,我只想选择线条上第一个出现的图案,例如“53.0”,我得到: $ echo "Core 0: +53.0°C (high = +80.0°C, crit = +100.0°C)" | sed -n 's/.*+\([0-9.]*\).*/\1/p' 对我来说,打印的是100.0,而我预期的是53.0 我正在使用Ubuntu18.04.3 LTS 我遗漏了什么?请您尝试以下内容 echo "Core 0: +53.0°C (high = +80.0°C, crit = +100.0°C)

我只想选择线条上第一个出现的图案,例如“53.0”,我得到:

$ echo  "Core 0: +53.0°C (high = +80.0°C, crit = +100.0°C)" |
  sed -n 's/.*+\([0-9.]*\).*/\1/p'
对我来说,打印的是100.0,而我预期的是53.0

我正在使用Ubuntu18.04.3 LTS


我遗漏了什么?

请您尝试以下内容

echo  "Core 0: +53.0°C (high = +80.0°C, crit = +100.0°C)" | 
sed 's/[^+]*+\([^ ]*\).*/\1/'
echo  "Core 0: +53.0°C (high = +80.0°C, crit = +100.0°C)" |  
sed 's/[^+]*+\([^°]*\).*/\1/'
或者,如果您不希望输出中出现
°
,请尝试以下操作

echo  "Core 0: +53.0°C (high = +80.0°C, crit = +100.0°C)" | 
sed 's/[^+]*+\([^ ]*\).*/\1/'
echo  "Core 0: +53.0°C (high = +80.0°C, crit = +100.0°C)" |  
sed 's/[^+]*+\([^°]*\).*/\1/'
上述代码说明:

我使用了
sed
将匹配的正则表达式保存到临时缓冲内存中的功能,并将其作为
\1
引用,以便以后打印

以下解释仅用于解释运行代码的目的,请使用上述代码

sed '          ##Starting sed program here.
s              ##Using s option for substitution method by sed on Lines of Input_file.
/[^+]*+        ##Using regex to have till 1st occurrence of + here.
\([^ ]*\)      ##Using memory buffer saving capability of sed to save matched regex in it.
               ##Have used regex to match everything till occurrence of space. Which should catch 1st temperature.
.*             ##Mentioning .* to match all rest line.
/\1/'          ##Now substituting whole line with 1st buffer matched value.
解释OP代码不起作用的原因:由于OP在其尝试中使用了
*+
,因此它与上次出现的
+
匹配,因此它给出了最后一个温度值


注:添加了Sundeep sir在评论中提供的链接,以便于理解

使用
awk
非常简单(不需要复杂的正则表达式)


打印第三个字段
$3
,然后
+0
仅用于获取数字,它修剪了
°C

请参见这两个字段也都工作了,非常感谢,特别是支持性的解释。@RogerM,欢迎您,您也可以选择此答案作为正确答案,干杯