我有很多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经验的人提供的帮助都是很棒的!谢谢!
发布于 2012-05-02 06:19:48
使用Perl修复您的Perl脚本。您可以对正则表达式使用大括号,以避免leaning toothpick syndrome。
perl -i -pe 's{^#!/opt/local/bin/perl5}{#!/some/new/path}' *.pl-i和-p用于就地编辑文件,有点像sed。详情请参见perlrun。
发布于 2012-05-02 06:16:21
我不太清楚你到底想要什么。如果您想要编辑$DIR中的所有文件,使它们的第一行是#![PERL5]而不是#!/opt/local/bin/perl5,则可以这样做:
sed --in-place '1s:^#!/opt/local/bin/perl5:#![PERL5]:' "$DIR"/*.pl发布于 2012-05-02 06:35:16
要使用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。
https://stackoverflow.com/questions/10405043
复制相似问题