0

我在我的 perl 脚本中使用了以下类型的脚本,并期望在第 1 行输入。我收到一些错误,如下所示;有什么帮助吗?

请忽略 perl 变量....

错误消息 - sed:-e 表达式 #1,字符 22:命令后的额外字符

# Empty file will not work for Sed line number 1
    `"Security Concerns Report" > $outputFile`;

    `sed '1i\
    \
    DATE :- $CDate \
    Utility accounts with super access:- $LNumOfSupUserUtil \
    Users not found in LDAP with super access: - $LNumOfSupUserNonLdap\

    ' $outputFile > $$`;
    `mv $$ $outputFile`;
}
4

1 回答 1

5

您的直接问题是反斜杠字符由 Perl 在反引号运算符中解释,美元字符也是如此。因此,您的反斜杠换行序列变成了执行的 shell 命令中的换行符。如果你用 替换这些反斜杠\\,你会克服这个障碍,但你仍然会有一个非常脆弱的程序。

Perl 正在调用一个调用 sed 的 shell。这需要对您未执行的 shell 进行额外的引用。如果您的文件名和数据不包含特殊字符,则您可能可以摆脱这种情况,直到有人使用包含 a 的日期格式'(在许多情况下会破坏您的代码)。

与其解决这个问题,不如在 Perl 中做所有事情要简单得多。sed 和 shell 可以做的所有事情,Perl 几乎可以轻松或更轻松地完成。你的问题不是很清楚你要做什么。我将专注于 sed 调用,但这可能不是编写程序的最佳方式。

如果您确实需要在现有文件中添加一些文本,CPAN上有一个广泛使用的模块已经很好地完成了这项工作。优先使用现有库而不是重新发明轮子。File::Slurp有一个prepend_file方法。在下面的代码中,我对多行字符串使用了here-document运算符。

use File::Slurp; # at the top of the script with the other use directives
File::Slurp->prepend_file($outputFile, <<EOF);
DATE :- $CDate
Utility accounts with super access:- $LNumOfSupUserUtil
Users not found in LDAP with super access: - $LNumOfSupUserNonLdap
EOF
于 2012-08-03T14:34:35.577 回答