【发布时间】:2014-05-22 15:19:57
【问题描述】:
我想以递归方式快速搜索和替换有或没有 regexp 的文件。此外,我只需要在特定文件中进行搜索,并且我不想触摸与我的 search_pattern 不匹配的文件,否则 git 会认为所有已解析的文件都已被修改(它会发生 find . --exec sed)。
我尝试了许多我在互联网上使用 find、grep、sed 或 ack 找到的解决方案,但我不认为它们真的适合仅匹配特定文件。
最后我写了这个 perl 脚本:
#!/bin/perl
use strict;
use warnings;
use File::Find;
my $search_pattern = $ARGV[0];
my $replace_pattern = $ARGV[1];
my $file_pattern = $ARGV[2];
my $do_replace = 0;
sub process {
return unless -f;
return unless /(.+)[.](c|h|inc|asm|mac|def|ldf|rst)$/;
open F, $_ or print "couldn't open $_\n" && return;
my $file = $_;
my $i = 0;
while (<F>) {
if (m/($search_pattern)/o) {$i++};
}
close F;
if ($do_replace and $i)
{
printf "found $i occurence(s) of $search_pattern in $file\n";
open F, "+>".$file or print "couldn't open $file\n" && return;
while (<F>)
{
s/($search_pattern)/($replace_pattern)/g;
print F;
}
close F;
}
}
find(\&process, ".");
我的问题是:
下面有没有更好的解决方案(不存在)?
`repaint -n/(.+)[.](c|h|inc|asm|mac|def|ldf|rst)$/ s/search/replacement/g .`
附属问题:
我的 perl 脚本怎么样?还不算太糟糕?我真的需要重新打开与我的 search_pattern 匹配的所有文件吗?
人们如何处理这项琐碎的任务?几乎每个优秀的文本编辑器都有“在文件中搜索和替换”功能,但 vim 没有。 vim 用户如何做到这一点?
编辑:
我也用ff | xargs perl -pi -e 's/foo/bar/g' 尝试了这个脚本 ff.pl,但它没有按我的预期工作。它创建了一个备份 .bak,即使我在 -pi 之后没有提供任何内容。这似乎是 cygwin 中的正常行为,但我不能真正使用 perl -pi -e
#!/bin/perl
use strict;
use warnings;
use File::Find;
use File::Basename;
my $ext = $ARGV[0];
sub process {
return unless -f;
return unless /\.(c|h|inc|asm|mac|def|ldf|rst)$/;
print $File::Find::name."\n" ;
}
find(\&process, ".");
重新编辑:
我终于遇到了这个解决方案(在cygwin下我需要删除备份文件)
find . | egrep '\.(c|h|asm|inc)$' | xargs perl -pi.winsucks -e 's/<search>/<replace>/g'
find . | egrep '\.(c|h|asm|inc)\.winsucks$' | xargs rm
【问题讨论】:
-
每个问题一个问题。
标签: regex perl search vim replace