我在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
有人有任何想法吗?
答案 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/ # ...