【问题标题】:How do I modify the shebang line in a Perl or shell script?如何在 Perl 或 shell 脚本中修改 shebang 行?
【发布时间】:2012-05-11 09:55:27
【问题描述】:

我有很多 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 经验的人的帮助都会很棒!谢谢!

【问题讨论】:

  • 你没有转义“bin”之前的斜线?

标签: linux perl search scripting replace


【解决方案1】:

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

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

【讨论】:

  • 是的,这就是我想做的。但它没有用。添加了 DIR 并转义了 ! 的 sed --in-place '1s:#\!/opt/local/bin/perl5:#\![PERL5]:' "./"/*.pl
  • 我不确定您的意思是“添加 DIR 并转义”。 DIR 应该是包含您的 .pl 文件的目录。该脚本将“就地”更改它们,因此根本不应该创建新目录。
  • 我的意思是我定义了它 :) 刘海(!)现在是 \!
  • 不要转义感叹号。只需在我的 sed 命令中准确输入我的内容即可。
【解决方案2】:

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

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

-i-p 用于就地编辑文件,有点像 sed。详情请见perlrun

【讨论】:

  • 或者您可以在sed 中的s 命令中使用: 来修复倾斜的牙签。
【解决方案3】:

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

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

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

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

【讨论】:

    【解决方案4】:

    假设如果你想将 perl5 更改为 perl6 尝试这个: perl -pi -e 's/perl5/perl6/' $file

    【讨论】: