2

必要な一貫したバージョンに更新する必要がある多くの Perl スクリプトがあり、現在さまざまなバージョンとフラグがあります。これらのステートメントはすべて、スクリプトの最初の行にあります。ここではあまり運がありませんでした。明らかに sed を使用しようとしていますが、もっと良いものはありますか?

編集が必要な行の例

 #!/opt/local/bin/perl5

次のようにbashスクリプトを試しましたが、うまくいきません。

#!/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 の経験がある人からの助けは素晴らしいでしょう! ありがとう!

4

4 に答える 4

4

Perl を使用して Perl スクリプトを修正します。正規表現に中括弧を使用して、つまようじ傾倒症候群を回避できます。

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

-i-psedのように、ファイルをその場で編集するために使用されます。詳細については、 perlrunを参照してください。

于 2012-05-01T22:19:48.437 に答える
1

あなたが何を望んでいるのか正確にはわかりません。のすべてのファイルを編集し$DIRて、最初の行が#![PERL5]の代わりに#!/opt/local/bin/perl5なるようにする場合は、次のようにします。

sed --in-place '1s:^#!/opt/local/bin/perl5:#![PERL5]:' "$DIR"/*.pl
于 2012-05-01T22:16:21.283 に答える
1

perl でファイルを編集するには、-piスイッチを使用します。あなたは最初の行だけを変更したかったので、正規表現がファイル内の他のものを変更することなくそうする方法を考えていました. この小さなハックはそれを可能にします。シバンのような文字列は実際には他の場所では見つからないはずなので、努力する価値があるかどうかはわかりません.

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

がすでに定義されている場合、オペレーターは RHS を実行しようとしないため、実際には 1 つの変更のみが実行されます//=。atを$x追加すると、次のファイルの変数がリセットされ、引数リスト内の各ファイルが一度変更されます。undef $xeof

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

于 2012-05-01T22:35:15.893 に答える