2016-08-17 16 views
0

存在しない場合、私はこの行を見つけ変数を拡張し、死にます。置換内の変数を展開しますが、1 が失敗したBEGINのすべてのPerlの構文:)Perlの正規表現は、ファイルが

perl -i -0777 -pe 'BEGIN{ -f $ARGV[0] or die".HEAD file is missing" }' 
"s|^\\Q${repo}:\\E.+$|${newrepo}|gm" .HEAD; 

.HEADファイルを-eラインで不足しているに精通していないイム - コンパイルは-eラインで中止さ1.

+0

最初の行の最後にある見積もりは、2行目の二重引用符( '.HEAD'の直前)の後にする必要があります。さらに、現在のディレクトリに '.HEAD'という名前のファイルがありますか? – Dada

+0

はい.HEADは、二重引用符の後に一重引用符を置くと変数が展開されない場合に存在します。 –

+1

シェル変数はPerl変数ではありません。 – choroba

答えて

3

シェルスクリプトでPerlコードを生成しない(しようとすると)!!!

perl -i -pe' 
    BEGIN { 
     $repo = shift(@ARGV); 
     $newrepo = shift(@ARGV); 

     open(my $fh, '<', $ARGV[0]) 
     or die("Can't open $ARGV[0]: $!\n"); 
    } 
    s|^\Q$repo:\E.+$|$newrepo|g; 
' "$repo" "$newrepo" .HEAD 

または

export repo 
export newrepo 
perl -i -pe' 
    BEGIN { 
     open(my $fh, '<', $ARGV[0]) 
     or die("Can't open $ARGV[0]: $!\n"); 
    } 
    s|^\Q$ENV{repo}:\E.+$|$ENV{newrepo}|g; 
' .HEAD 

または

repo="$repo" newrepo="$newrepo" perl -i -pe' 
    BEGIN { 
     open(my $fh, '<', $ARGV[0]) 
     or die("Can't open $ARGV[0]: $!\n"); 
    } 
    s|^\Q$ENV{repo}:\E.+$|$ENV{newrepo}|g; 
' .HEAD 

注:

  • ファイルは偽の場合でも-fリターンを存在することができます。実際のエラーは$!です。 openを使用すると、ファイルを開くことができるかどうかを確認する際に、より正確に-fとなります。

  • わかりやすくするために改行を追加しました。必要に応じてそれらを削除しますが、削除する必要はありません。

  • この結果、役に立たなかった-0777/mが削除されました。

3

Perl変数はシェル変数と同じではありません。自分でファイルを開き、

perl -i -0777 -ne 'BEGIN { ($file, $repo, $new) = @ARGV; 
          die "$file missing\n" unless -f $file; 
        } 
        s/^\Q$repo:\E.+$/$new/gm; 
        print; 
        last if eof; 
        ' -- .HEAD "$repo" "$newrepo" 

または:スクリプトに値を渡すには、paramteresを使用することができますが、あなたはあまりにも、そうでない場合、Perlはファイル名などのパラメータを扱います、最初eof上の入力の処理を停止する必要があります:

if perl -0777 -e '($file, $repo, $new) = @ARGV; 
        open $FH, "<", $file or die "$file: $!"; 
        while (<$FH>) { 
         s/^\Q$repo:\E.+$/$new/gm; 
         print; 
        }' -- .HEAD "$repo" "$newrepo" > newfile 
then 
    mv newfile .HEAD 
fi 
+0

2つの違いの説明:2番目のスニペットは 'ARGV'を使用しないので、' -i'は効果がないので、 "インプレース"アスペクトを自分で処理する必要があります。プラス面では、エラーが発生した場合に '.HEAD'が壊れるのを避けることができます。 – ikegami