如何修改Perl或shell脚本中的shebang行?

时间:2012-05-01 22:05:54

标签: linux perl search scripting replace

我有很多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 个答案:

答案 0 :(得分:4)

使用Perl修复Perl脚本。您可以对正则表达式使用大括号来避免leaning toothpick syndrome

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

-i-p用于编辑文件,有点像sed。有关详细信息,请参阅perlrun

答案 1 :(得分:1)

我不确定你想要的是什么。如果您想要编辑$DIR中的所有文件,以便他们的第一行是#![PERL5]而不是#!/opt/local/bin/perl5,则可以这样做:

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

答案 2 :(得分:1)

要使用perl编辑文件,您可以使用-pi开关。由于您只想更改第一行,我正在考虑这样做而不会导致正则表达式更改文件中的任何其他内容。这个小黑客将允许这样做。不确定这是否值得付出努力,因为在其他地方不应该找到类似shebang的字符串。

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

如果//=已经定义,$x运算符将不会尝试执行RHS,因此这实际上只会执行一次更改。在undef $x添加eof将重置下一个文件的变量,导致参数列表中的每个文件都被更改一次。

您可能不想要备份,在这种情况下,您需要从.bak开关中删除-i

答案 3 :(得分:1)

假设您要将perl5更改为perl6 试试这个: perl -pi -e' s / perl5 / perl6 /' $文件