2012-05-01 3 views
2

私は多くのPerlスクリプトを必要とします。これには、一貫したバージョンが必要であり、現在さまざまなバージョンとフラグが必要です。これらのステートメントはすべてスクリプトの最初の行にあります。私はここでは、明らかにsedを使用しようとしている多くの運を持っていないが、何か良いですか?次のように私はbashスクリプトを試してみましたが、それは私のために動作しませんPerlやシェルスクリプトでシバン行を変更するにはどうすればよいですか?

#!/opt/local/bin/perl5 

を編集する必要

例ライン。

#!/bin/bash 
echo "Changing Perl headers in the following..." 
for file in $(ls $1*.pl) 
do 
    echo $file 
    sed 's/#!\/opt\/local/bin\/perl5/#![PERL5]/' $file > /dev/null 
# Perl Version: PERL5 
done 

sedの経験があれば助けてください。ありがとう!

+0

あなたが "ビン" の前にスラッシュをエスケープしていませんか? –

答えて

1

私はそれがあなたが何を望んでいるか正確にはわかりません。あなたのPerlスクリプトを修正するために

sed --in-place '1s:^#!/opt/local/bin/perl5:#![PERL5]:' "$DIR"/*.pl 
+0

はい、それは私がしたいことです。しかし、それは動作しませんでした。 DIRを追加してエスケープしました! sed --in-place '1s:#\!/ opt/local/bin/perl5:#\![PERL5]:' "./"/*.pl pillsdoughboy

+0

私はあなたが「DIRを追加してエスケープしました」とは何を意味するのかわかりません。 'DIR'はあなたの' .pl'ファイルが入っているディレクトリです。このスクリプトはそれらを "インプレース"に変更するので、新しいディレクトリをまったく作成する必要はありません。 –

+0

私はそれを定義したことを意味します:)バング(!)は現在\です! – pillsdoughboy

4

使用されたPerl:あなたは彼らの最初の行は#![PERL5]代わりの#!/opt/local/bin/perl5なるよう$DIR内のすべてのファイルを編集したい場合は、これはそれを行います。正規表現には中カッコを使用して、leaning toothpick syndromeを避けることができます。 sedのよう

perl -i -pe 's{^#!/opt/local/bin/perl5}{#!/some/new/path}' *.pl 

-i-pはちょっと、場所にファイルを編集するために使用されています。詳細は、perlrunを参照してください。

+0

あるいは、 'sed'の' s'コマンドで ':'を使うだけで、傾いた爪楊枝を修正することができます。 –

1

perlでファイルを編集するには、-piスイッチを使用します。最初の行だけを変更したかったので、ファイル内の他の部分を正規表現で変更することなく、そうする方法を検討していました。この小さなハックはそれを可能にします。シバンのような弦が他の場所に実際には見られないので、努力する価値があるかどうかは分かりません。 $xが既に定義されている場合

perl -pi.bak -e ' 
    $x //= s|^#!/opt/local/bin/perl5|#![PERL5]|; 
    undef $x if eof;' *.pl 

//=オペレータはRHSを実行しようとしないので、効果で、この意志は、唯一の変更を行います。 eofundef $xを追加すると、次のファイルの変数がリセットされ、引数リストの各ファイルが一度変更されます。

バックアップが必要ない場合は、-iスイッチから.bakを削除します。

1

あなたはPerl6の へのperl5を変更する場合とし、これを試してみてください: のperl -pi -eさん/ perl5の/ Perl6の/ '$ファイル

関連する問題