' SED' perl脚本错误中的用法

时间:2012-11-08 12:11:59

标签: perl sed

我在Perl脚本中有以下行:

my $temp = `sed 's/ /\n/g' /sys/bus/w1/devices/w1_bus_master1/10-000802415bef/w1_slave | grep t= | sed 's/t=//'`;

这会引发错误: “sed:-e表达式#1,字符2:未终止的's'命令”

如果我运行如下的shell脚本,它可以正常工作:

temp1=`sed 's/ /\n/g' /sys/bus/w1/devices/w1_bus_master1/10-000802415bef/w1_slave | grep t= | sed 's/t=//'`
echo $temp1

有人有任何想法吗?

2 个答案:

答案 0 :(得分:3)

Perl将您的\n解释为文字换行符。因此,从sed的角度看,你的命令行看起来像这样:

sed s/ /
/g ...

哪个sed不喜欢。 shell不会那样解释它。

正确的解决方案是不要在这种情况下使用sed / grep。毕竟,Perl非常非常擅长处理文本。例如(未经测试):

use File::Slurp;
my @lines = split m/\n/, map { s/ /\n/g; $_ } scalar(read_file("/sys/bus...));
@lines    = map { s/t=//; $_ } grep { m/t=/ } @lines;

或者逃避\n一次,例如sed 's/ /\\n/g'...

答案 1 :(得分:1)

您需要在我们的第一个正则表达式中转义\n。 perl中的反引号运算符认为它是一个控制字符,并插入换行符而不是字符串\n

                     |
                     V
my $temp = `sed 's/ /\\n/g' /sys/bus/ # ...