1

我在 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 expression #1, char 2: unterminated `s' command”

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

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

有人有什么想法吗?

4

2 回答 2

4

Perl 将 your 解释\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'...

于 2012-11-08T12:17:18.193 回答
1

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

                     |
                     V
my $temp = `sed 's/ /\\n/g' /sys/bus/ # ...
于 2012-11-08T12:15:19.207 回答