我一直在尝试编写一个 Perl 脚本来替换我项目的所有源文件上的一些文本。我需要类似的东西:
perl -p -i.bak -e "s/thisgoesout/thisgoesin/gi" *.{cs,aspx,ascx}
但这会解析 全部 目录的文件 递归 .
我刚开始写一个脚本:
use File::Find::Rule;
use strict;
my @files = (File::Find::Rule->file()->name('*.cs','*.aspx','*.ascx')->in('.'));
foreach my $f (@files){
if ($f =~ s/thisgoesout/thisgoesin/gi) {
# In-place file editing, or something like that
}
}
但现在我被困住了。有没有一种简单的方法可以使用 Perl 就地编辑所有文件?
请注意,我不需要保留每个修改过的文件的副本;我让他们都被颠覆了 =)
更新 : 我在 Cygwin 上试过这个,
perl -p -i.bak -e "s/thisgoesout/thisgoesin/gi" {*,*/*,*/*/*}.{cs,aspx,ascx
但看起来我的参数列表爆炸到了允许的最大大小。事实上,我在 Cygwin 上遇到了非常奇怪的错误......
最佳答案
如果您分配 @ARGV
使用前 *ARGV
(又名钻石 <>
),$^I
/-i
将处理这些文件,而不是在命令行中指定的文件。
use File::Find::Rule;
use strict;
@ARGV = (File::Find::Rule->file()->name('*.cs', '*.aspx', '*.ascx')->in('.'));
$^I = '.bak'; # or set `-i` in the #! line or on the command-line
while (<>) {
s/thisgoesout/thisgoesin/gi;
print;
}
这应该完全符合您的要求。
如果您的模式可以跨越多行,请添加
undef $/;
之前<>
以便 Perl 一次对整个文件进行操作,而不是逐行操作。
关于perl - 有没有一种简单的方法来进行批量文件文本替换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/248668/