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

我有很多的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 

任何有经验的人的帮助将是伟大的! 谢谢!

使用Perl来修复你的Perl脚本。 您可以使用正则表达式的括号来避免倾斜的牙签综合征 。

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

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

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

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

要用perl编辑文件,可以使用-pi开关。 因为你只是想改变第一行,所以我正在考虑这样做,而不会导致正则表达式改变文件中的其他东西。 这个小黑客会允许的。 不知道是否值得这个努力,因为shebang-like字符串不应该在其他地方找到。

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

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

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

假设你想把perl5改成perl6试试这个:perl -pi -e's / perl5 / perl6 /'$ file