我正在寻找一种用perl替换大文本中的单词的方法,并希望从包含替换的另一个文件中读取单词。我知道我能做到:
#!/usr/bin/perl
use warnings;
use strict;
open my $fh_in, '<', $ARGV[0] or die "No input: $!";
open my $fh_out, '>', $ARGV[1] or die "No output: $!";
while (<$fh_in>)
{
s/John/Jack/g;
print $fh_out $_;
}
...并添加任意数量的s/Fred/Frank/g;
行。
是否可以引用包含所有替换的外部文本文件?这是为了在访谈中匿名化姓名。
我想在格式中保留一个简单的文本文件:
Name Pseudonym
John Jack
Fred Frank
etc.
(以制表符分隔)
如果有更好的方法,我会感谢您的建议。
原始文件来自一个Excel数据库,该数据库在两列中包含所有名称替换,但它很容易将其转换为文本文件,我不想让它过于复杂,因为我在不太熟悉脚本和东西。
答案 0 :(得分:1)
读取包含散列中对应关系的文件,然后执行以下替换:
setUp
答案 1 :(得分:0)
如果您在进行替换之前阅读了将在内存中执行替换的文件的所有内容,则会更容易。
另外,您应该小心不要替换特定的子字符串。如果您有输入文件:“Hello Fred”。在替换名单“弗雷德弗兰克”和“弗兰克弗兰克斯坦”中,你最终会得到“你好弗兰克斯坦”......
我将替换列表放在 DATA 部分下,使其自包含。
use strict;
use warnings;
use utf8;
use IO::All;
my %list;
die "File not found or can't be read\n"
unless $ARGV[0] && -e $ARGV[0] && -r $ARGV[0];
die "Need an output file name\n" unless $ARGV[1];
my $output = $ARGV[1];
while (<DATA>) {
my ( $name, $nick ) = m/(\w+)\t(\w+)$/;
next unless $name && $nick;
$list{$name} = $nick;
}
my $contents = io->file($ARGV[0])->slurp;
for my $name ( keys %list ) {
$contents =~ s/\b$name\b/$list{$name}/g;
}
$contents > io($output);
__DATA__
John Jack
Fred Frank