我想了解此代码的sed部分:
/usr/local/bin/pcsensor -l60 -n | sed -e "s/^.*\$/PUTVAL downloads\/exec-environmental\/temperature-cpu interval=30 N:\0/"
(输入)pcsensor产生:
2016/09/19 22:41:31 Temperature 90.50F 32.50C
代码生成(输出):
PUTVAL downloads/exec-environmental/temperature-cpu interval=30 N:32.50
我希望理解sed表达式会帮助我敲掉最后一位数字(所以temp只有小数点后1位)。
更新了:我的booboo(已经很晚了):
命令第一部分的-n输出:
32.50
在echo / printf
中工作正常printf "32.50 %s\n"| sed -e "s/^.*\$/PUTVAL downloads\/exec-environmental\/temperature-cpu interval=30 N:\0/"
答案 0 :(得分:2)
关于
sed -e "s/^.*\$/PUTVAL downloads\/exec-environmental\/temperature-cpu interval=30 N:\0/"
这是1个sed命令,即"替换"的s/.../.../
。简单来说,它只进行一次搜索和替换"对于它开始工作的每一行。
"搜索"部分是^.*\$
,"替换"部分是PUTVAL downloads\/exec-environmental\/temperature-cpu interval=30 N:\0/
。
^.*\$
是一个简单的Regular expression,它代表"所有内容"或"整行"。因此,s
命令将用
PUTVAL downloads\/exec-environmental\/temperature-cpu interval=30 N:\0/
正如Benjamin W. pointed out \0
的使用是"奇怪的"。它显然是一个所谓的引用,所以我们搜索的部分被附加在文本之后" PUTVAL(...)val = 30 N:"。
但是我提出的方式有几个问题。
\0
不在我的Debian GNU Sed 4.2.2的联机帮助页中。sed
引用"
命令,并且会使事情变得不必要地复杂且容易出错。应该使用单引号。\0
,特别是在Sed中,很可能代表一个空字符,由于"
引用,这里引发了更多的红旗。 sed
添加文本是"无用的Sed"。由于您询问了sed
,以下是我的编写方式:
sed -e 's/^.*$/PUTVAL downloads\/exec-environmental\/temperature-cpu interval=30 N:&/'
&
代表"搜索部分找到的内容"。在你的情况下,整行。
为了切断最后一个小数,有很多方法可以实现这一点。一种相当简单的方法假设输入总是有2位小数。然后我们可以添加一个命令来替换最后一个字符(.$
)和"没有" (//
):
sed -e 's/.$//;s/^[0-9][0-9]*\.[0-9]/PUTVAL downloads\/exec-environmental\/temperature-cpu interval=30 N:&/'
然而,正如我所说,sed
在这里是过度的。您可以使用例如printf
:
text='PUTVAL downloads/exec-environmental/temperature-cpu interval=30 N:'
printf "%s%3.1f\n" "$text" $(/usr/local/bin/pcsensor -l60 -n)