0

我有两个文本文件。我想从</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 是按顺序排列的,所以如果我可以</sup>text<sup>先从文本 A 中读取,将其保存在 temp 中,从文本 A 中删除这一行,将其放在{}文本 B 的第一个空闲槽中,然后重新开始,那就太好了。数字将匹配,因为订单已保存。对不起我的英语:) 谢谢!

4

1 回答 1

2

此代码将所有 dict 项按照它们出现的顺序放在一个数组中。然后循环 tex 文件,每次命中 \pkt{num}{} 时都会插入数组中的一个项目。

dict 中的换行符被处理并替换为空格(如果您不想要此行为,只需在地图中删除此替换)。只要部分 \pkt{num}{} 不跨越多行,就应该找到 \pkt。否则我认为最简单的解决方案是取消定义 $/ (输入记录分隔符)并将整个文件读入一个字符串,然后循环替换(虽然可能有点内存不足)。

#!/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);
于 2011-05-01T15:00:35.283 回答