在不丢失格式的情况下,在等效列表中更改其他人的单词

时间:2014-04-06 15:06:51

标签: regex perl

有一个输入文件夹, 和输出文件夹 和等效文件夹列表。

我在哪里可以开始研究,为了在输入文件夹中的列表文档中有一个单词,从等效列表中获取它的等价物,并进行替换并生成txt输出,总是在所有输出中使用utf8文档。

如果我有一个等价物列表:

bovine = cattle
cancrine = crab
canine = dog
cervine = deer
corvine = crow
equine = horse
elapine = snake 

我有一个像这样的输入文件:

bovine cancrine canine cervine equine text1 text2 elapine.

我希望它在输出文件中是这样的:

cattle crab dog deer [text1] [text2] snake

text1和text2在方括号中,因为它们不在等效列表中。

但即使后面有昏迷或其他标点符号也能改变单词。 例如,输入如下:

bovine! cancrine, ,canine# cervine% $equine text1, text2,,, elapine......

应该返回:

cattle! crab, ,dog# deer% $horse [text1], [text2[,,, snake......

请使用perl脚本。 我应该说我不是程序员,但是我的一个朋友多年前为我制作了这样的程序,它只是几行,但这就是我所理解的。 我只记得他正在使用正则表达式:^[^=]+=[.*]+$来读取类似的东西。

我使用的是活动perl,最新版本。 我希望在等价物中包括caracters°ŸÖ†ª或者其他ascii字符,我不能再联系我的朋友,所以我要求帮助这样做,将英语单词翻译成语音。 感谢

预计脚本应位于同一文件夹中,该文件夹包含3个文件夹,输入,输出和列表。 因此,如果我双击脚本,则应转换输入文本并将文件放在输出文件夹中。

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

perl的一种方式:

#!/usr/bin/perl
use strict;
use warnings;
use autodie;

open my $LOOKUP , "<" , "file.txt";
open my $LIST   , "<" , "list.txt";
open my $OUTPUT , ">" , "output.txt";

my %h;

while (<$LOOKUP>) {
    chomp;
    my ($k, $v) = split /\s*=\s*/;
    $h{$k} = $v;
}

while (<$LIST>) {
    s/([a-zA-Z0-9]+)/$h{$1} || "[$1]"/eg;
    print $OUTPUT $_;
}

为了一个单行的乐趣:

perl -lpe '
BEGIN{$x=pop;%h=map{$_->[0]=>$_->[2]}map[split],<>;@ARGV=$x}
s/([a-zA-Z0-9]+)/$h{$1}||"[$1]"/eg' file.txt list.txt > output.txt