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



我在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,char 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

有人有任何想法吗?

perl将您的 n解释为字面的新线字符。因此,您的命令行将从SED的角度看起来像这样:

sed s/ /
/g ...

哪个不喜欢。壳不会以这种方式解释。

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

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'...

您需要在我们的第一个正则表达式中逃脱n。Perl中的Backtick-operator认为它是一个控制符号,并插入Newline而不是字符串n

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

最新更新