gpt4 book ai didi

perl - 有没有一种简单的方法来进行批量文件文本替换?

转载 作者:行者123 更新时间:2023-12-04 00:06:27 33 4
gpt4 key购买 nike

我一直在尝试编写一个 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/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com