首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何修改Perl或shell脚本中的shebang行?

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

Stack Overflow用户
提问于 2012-05-02 06:05:54
回答 4查看 1.4K关注 0票数 2

我有很多Perl脚本需要更新到一致的版本,目前有不同的版本和标志。所有这些语句都位于脚本的第一行。我在这里不太走运,显然是想使用sed,但是有没有更好的东西呢?

需要编辑的示例行

代码语言:javascript
复制
 #!/opt/local/bin/perl5

我尝试了bash脚本,如下所示,但它不适用于我。

代码语言:javascript
复制
#!/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经验的人提供的帮助都是很棒的!谢谢!

EN

回答 4

Stack Overflow用户

发布于 2012-05-02 06:19:48

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

代码语言:javascript
复制
perl -i -pe 's{^#!/opt/local/bin/perl5}{#!/some/new/path}' *.pl

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

票数 4
EN

Stack Overflow用户

发布于 2012-05-02 06:16:21

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

代码语言:javascript
复制
sed --in-place '1s:^#!/opt/local/bin/perl5:#![PERL5]:' "$DIR"/*.pl
票数 1
EN

Stack Overflow用户

发布于 2012-05-02 06:35:16

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

代码语言:javascript
复制
perl -pi.bak -e '
    $x //= s|^#!/opt/local/bin/perl5|#![PERL5]|; 
    undef $x if eof;' *.pl

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10405043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档