解码sed表达式

时间:2016-09-19 21:44:32

标签: sed

我想了解此代码的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/"

1 个答案:

答案 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引用"命令,并且会使事情变得不必要地复杂且容易出错。应该使用单引号。
  • Shell中的任何地方都有一个\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)