我有两个文本文件。我想从</sup><sup>
标记之间的第一个文本中获取文本,然后将其插入到{}
之间的另一个文本文件中。
更好的例子(像字典一样)
Text1:
<sup>1</sup>dog
<sup>2</sup>cat
<sup>3</sup>lion
<sup>1</sup>flower
<sup>2</sup>tree
.
.
Text2:
\chapter1
\pkt{1}{}{labrador retirever is..}
\pkt{2}{}{home pets..}
\pkt{3}{}{wild cats..}
\chapter2
\pkt{1}{}{red rose}
\pkt{2}{}{lemon tree}
.
.
What I want:
Text3:
\chapter1
\pkt{1}{dog}{labrador retirever is..}
\pkt{2}{cat}{home pets..}
\pkt{3}{lion}{wild cats..}
\chapter2
\pkt{1}{flower}{red rose}
\pkt{2}{tree}{lemon tree}
文字是随机的,但你可以看到我想要的东西。 Perl是最好的。
所以得到
</sup>**text**<sup>
并将其粘贴到
\pkt{nr}{**here**}{this is translation of this word already stored in text2}.
文本A和B是有序的,所以如果我可以从文本A中读取第一个</sup>text<sup>
,将其保存在临时文本中,从文本A中删除该行,将其放在第一个免费的{}
插槽中文字B,重新开始它会很棒。数字将匹配,因为订单已保存。
对不起我的英语不好:)
谢谢!
答案 0 :(得分:2)
此代码按照它们出现的顺序将所有dict项放入数组中。然后循环tex文件,每次点击\ pkt {num} {}时,都会插入数组中的项目。
dict中的换行符被处理并用空格替换(如果你不想要这种行为,只需在地图中删除这个替换)。只要部分\ pkt {num} {}没有跨越多行,就应该找到\ pkt。否则我认为最简单的解决方案是将undef $ /(输入记录分隔符)并将整个文件读入一个字符串,然后循环替换(虽然可能有点内存耗尽)。
#!/usr/bin/perl -wT
use strict;
my $dict_filename = 'text1';
my $tex_filename = 'text2';
my $out_filename = 'text3';
open(DICT, $dict_filename);
my @dict;
{
# Set newline separator to <sup>
local $/ = '<sup>';
# Throw away first "line", it will be empty
<DICT>;
# Extract string and throw away newlines
@dict = map { $_ =~ m@</sup>\s*(.*?)\s*(?:<sup>|$)@s; $_ = $1; $_ =~ s/\n/ /g; $_; } <DICT>;
}
close(DICT);
open(TEX, $tex_filename);
open(OUT, ">$out_filename");
my $tex_line;
my $dict_pos = 0;
while($tex_line = <TEX>)
{
# Replace any \pkt{num}{} with \pkt{num}{text}
$tex_line =~ s|(\\pkt\{\d+\}\{)(\})|$1$dict[$dict_pos++]$2|g;
print OUT $tex_line;
}
close(TEX);
close(OUT);