Вставить другой текст в другой с помощью регулярных выражений? - PullRequest
0 голосов
/ 01 мая 2011

У меня есть два текстовых файла.Я хочу взять текст из первого тега </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}.

Текст А и В в порядке, так что, если бы я мог читать первым </sup>text<sup> из текста A, сохраните его в temp, удалите эту строку из текста A, поместите его в первый свободный {} слот в тексте B и начните заново, было бы здорово.Номера будут совпадать, потому что заказ сохранен.Извините за мой английский :) Спасибо!

1 Ответ

2 голосов
/ 01 мая 2011

Этот код помещает все элементы dict в массив в порядке их появления.Затем текстовый файл зацикливается, и каждый раз, когда \ pkt {num} {} попадает, элемент из массива вставляется.

Новые строки в dict обрабатываются и заменяются пробелами (Просто удалите эту замену в карте, еслиты не хочешь такого поведения).\ pkt должен быть найден до тех пор, пока часть \ pkt {num} {} не занимает несколько строк.В противном случае, я думаю, что самым простым решением было бы отменить $ / (разделитель входных записей) и прочитать весь файл в строку и просто зациклить замену (хотя это может быть немного требовательно к памяти).

#!/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);
...