1

sed を使用して、最初の行を削除し、後続の行の先頭と末尾の空白を削除しようとしています

私が次のようなものを持っている場合

ライン1
     2行目
  ライン3

印刷する必要があります

2行目
ライン3

だから私はUNIXシェルでこのコマンドを試しました:

sed '1d;s/^ [ \t]*//;s/[ \t]*$//' file.txt

期待どおりに動作します。

私のperlスクリプトで同じことをしようとすると:

my @templates = `sed '1d;s/^ [ \t]*//;s/[ \t]*$//' $MY_FILE`;

「sed: -e expression #1, char 10: unterminated `s' command」というメッセージが表示され、何も出力されません。誰かが私が間違っているところを教えてもらえますか

4

6 に答える 6

2

とにかく、なぜ Perl から Sed を呼び出すのでしょうか? sed を同等の Perl コードに置き換えるのは、よく計画されたキーストロークのほんの一部です。

my @templates;
if (open (M, '<', $MY_FILE)) {
    @templates = map { s/(?:^\s*|\s*$)//g; $_ } <M>;
    shift @templates;
    close M;
}  else { # die horribly? }
于 2013-09-18T19:52:32.650 に答える
1

表現に誤りがあります。2 つの置換ステートメントの間にセミコロンが必要です。代わりに次を使用する必要があります。

my @templates = `sed '1d;s/^ [ \\t]*//;s/[ \\t]*\$//' $MY_FILE`;

エスケープ$\、他の回答で示唆されているように。\リテラルタブに置き換えられたため、エスケープせずに機能したことにも注意してください。

于 2013-09-18T19:27:26.007 に答える
1

エスケープの問題を回避するために、バッククォートの代わりにセーフ パイプ オープンを使用することを検討してください。例えば:

my @templates = do {
    open my $fh, "|-", 'sed', '1d;s/^ [ \t]*//;s/[ \t]*$//', $MY_FILE
        or die $!;
    local $/;
    <$fh>;
};
于 2013-09-18T19:45:04.040 に答える
1

バックティックは二重引用符のように機能します。Perl は、$MY_FILE. ご存じないかもしれませんが、これ$/は実際にはvariableであり、入力レコード区切り文字 (デフォルトでは改行文字) です。タブ文字の前のバックスラッシュについても同様です。ここで、Perl が解釈\tしてタブ文字に置き換えます。sed が\t実際のタブ文字の代わりに認識するように、2 番目のバックスラッシュが必要になります。ただし、後者も同様に機能する可能性があります。

于 2013-09-18T19:03:43.960 に答える