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-p用于就地编辑文件,有点像 sed。有关详细信息,请参阅perlrun

于 2012-05-01T22:19:48.437 回答
1

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

于 2014-01-06T13:51:21.523 回答
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开关。由于您只想更改第一行,因此我正在考虑一种方法来这样做,而不会导致正则表达式更改文件中的任何其他内容。这个小技巧将允许这样做。不确定是否值得付出努力,因为在其他地方不应该真正找到类似 shebang 的字符串。

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

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

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

于 2012-05-01T22:35:15.893 回答