0

私は自分の perl スクリプトで次の種類のスクリプトを使用しており、1 行目にエントリを期待しています。以下のようなエラーが発生しています。助けはありますか?

plzはperl変数を無視します....

エラーメッセージ - sed: -e expression #1, char 22: extra characters after command

# 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

当面の問題は、バックスラッシュ文字が、ドル文字と同様に、バックティック operator内で Perl によって解釈されることです。したがって、バックスラッシュと改行のシーケンスは、実行されるシェル コマンドで改行に変わります。これらのバックスラッシュを に置き換えると\\、このハードルを超えることができますが、それでも非常に脆弱なプログラムになります。

Perl は sed を呼び出すシェルを呼び出しています。これには、実行していないシェルの追加レベルの引用が必要です。ファイル名とデータに特殊文字が含まれていない場合は、誰かが'(コードを壊す可能性のある多くのものの中で) を含む日付形式を使用するまで、これを回避できる可能性があります。

これを修正するよりも、Perl ですべてを行う方がはるかに簡単です。sed と shell でできることはすべて、Perl でもほぼ同じか簡単に実行できます。あなたが何をしようとしているのか、あなたの質問からはあまり明確ではありません。ここでは sed 呼び出しに焦点を当てますが、これはプログラムを作成する最良の方法ではないかもしれません。

既存のファイルに何らかのテキストを追加する必要がある場合は、CPANに広く使用されているモジュールがあり、既にこれをうまく行っています。一からやり直すよりも、既存のライブラリを使用してください。File::Slurpそのためのprepend_fileメソッドがあります。以下のコードでは、複数行の文字列にヒアドキュメント演算子を使用しています。

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 に答える