簡體   English   中英

使用正則表達式將不同的文本插入另一個文本?

[英]Inserting different text to another using Regular Expressions?

我有兩個文本文件。 我想從</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> ,將其保存在 temp 中,從文本 A 中刪除這一行,將其放在文本 B 中的第一個空閑{}插槽中,重新開始會很棒。 數字將匹配,因為訂單已保存。 對不起我的英語:) 謝謝!

此代碼將所有 dict 項按照它們出現的順序放在一個數組中。 然后循環 tex 文件,每次命中 \pkt{num}{} 時都會插入數組中的一個項目。

dict 中的換行符被處理並替換為空格(如果您不想要這種行為,只需在 map 中刪除此替換)。 只要部分 \pkt{num}{} 不跨越多行,就應該找到 \pkt。 否則,我認為最簡單的解決方案是取消定義 $/ (輸入記錄分隔符)並將整個文件讀入一個字符串,然后循環替換(雖然可能有點 memory 餓了)。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM