用表格中的perl脚本替换单词(以匿名名称)

时间:2016-08-21 13:57:43

标签: regex perl replace

我正在寻找一种用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数据库,该数据库在两列中包含所有名称替换,但它很容易将其转换为文本文件,我不想让它过于复杂,因为我在不太熟悉脚本和东西。

2 个答案:

答案 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