2012-08-03 76 views
0

我在我的perl脚本中使用了以下类型的脚本,期望在第1行输入内容。任何帮助?sed in perl脚本

PLZ忽略perl的可变....

错误Messaage - 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`; 
} 
+10

我不太清楚为什么你使用Perl来调用sed和mv,当Perl可以做到所有这一切,除了本地! – 2012-08-03 13:29:57

+3

这似乎应该是一个bash脚本...不是一个perl脚本 – 2012-08-03 13:43:36

+0

基本上这是一个在Perl中编写bash脚本的方法(很可怕)) – pavel 2012-08-03 13:59:49

回答

5

你的眼前的问题是,反斜线字符由Perl中的backtick operator解释,正如美元字符一样。所以你的backslash-newline序列在执行的shell命令中变成一个换行符。如果您将这些反斜杠替换为\\,那么您将会跨过这个障碍,但仍然会有一个非常脆弱的程序。

Perl正在调用一个调用sed的shell。这需要为您没有执行的shell提供额外的引用级别。如果您的文件名和数据中不包含特殊字符,您可能可以避开这个问题,直到有人使用包含'的日期格式(在会破坏您的代码的许多事情中)。

与其解决这个问题,在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