当脚本 运行 时 sed "unterminated `s'command`" 错误

sed "unterminated `s'command`" error when running from a script

我有一个 temp 文件,其内容为:

a 
b
c
d
e

当我从命令行 运行 sed 's#b#batman\nRobin#' temp 时,我得到:

a
batman
Robin
c
d
e

但是,当我 运行 来自 Perl 脚本的命令时

#!/usr/bin/perl

use strict;
use warnings;

`sed 's#b#batman\nRobin#' temp`

产生错误:

sed: -e expression #1, char 10: unterminated `s' command

我做错了什么?

为什么要在 Perl 程序中使用 运行 另一个类似 sed 的工具?如果有的话,现在您拥有更多的工具和功能,所以只需使用 Perl 即可。

一种简单的方法来完成您的 sed 事情

use warnings;
use strict;

die "Usage: [=10=] file(s)\n" if not @ARGV;

while (<>) { 
    s/b/batman\nRobin/;
    print;
}

运行 这个程序通过在命令行上提供文件 (temp) 给它。 die 行仅用于 support/enforce 这种用法;对于脚本的运行来说是无关紧要的。

这个程序就是一个简单的过滤器

  • <> operator逐行读取命令行提交的所有文件

  • 一行被它分配给$_ variable,这是Perl中很多东西的默认值

  • 默认情况下 s/// 运算符 binds to $_,它会被更改(如果模式匹配)

  • print 默认打印 $_ 变量

  • 在正则表达式中几乎可以使用任何你想要的分隔符,请参阅 m// and s/// 运算符

也可以这样做

while (<>) {
    print s/b/batman\nRobin/r
}

使用 /r modifier s/// returns 更改后的字符串(如果模式不匹配则为原始字符串)

最后也是

print s/b/batman\nRobin/r while <>;

但我希望使用脚本您真的想做更多事情,然后可能不是这样。

另一方面你可以写得更恰当

use warnings;
use strict;
use feature qw(say);

die "Usage: [=13=] file(s)\n" if not @ARGV;

while (my $line = <>) { 
    chomp $line;

    $line =~ s/b/batman\nRobin/;

    say $line;
}

lexical variable nicely chomp-ed 中添加了一行,可以进行更多工作了。