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