Заменить множественное вхождение слова в строку файла, используя perl - PullRequest
0 голосов
/ 14 апреля 2019

Необходимо заменить несколько вхождений слов в строках текстового файла

#!/usr/bin/perl

use strict;

use warnings;

use Tie::File;

my $string2 = 'first_part';

my $string3 = 'middle_part';

my $string4 = 'last_part';

my @contents=();

tie @contents, 'Tie::File','test.html' or die "Not able to Tie test.html\n";

my $count=1;

foreach (@contents)

{

my $string = $_;

my $quoted_substring = quotemeta($string);

my $before = 'test_example_start';

my $after  = 'text_example_end';

if ($string =~ /\Q$before\E(.*?)\Q$after\E/) {

my $finalstr = "$string2$1$string3$1$string4"; 

s/$quoted_substring/$finalstr/g;


 print $finalstr;  

} 
        $count++;

    my $finalstr ='';

}

untie @contents;

Фактическая строка:

test_example_start this is lesson-1 text_example_end where everyone attended the class test_example_start this is lesson-2 text_example_end where two members attended the class test_example_start this is lesson-3 text_example_end where five members attended the class

Ожидаемый результат:

first_part this is lesson-1 middle_part this is lesson-1 last_part where everyone attended the class first_part this is lesson-2 middle_part this is lesson-1 last_part where two members attended the class first_part this is lesson-1 middle_part this is lesson-3 last_part where five members attended the class

текущий результат: весь абзац заменяется только одной строкой.как показано ниже

first_part this is lesson-1 middle_part this is lesson-1 last_part

1 Ответ

0 голосов
/ 14 апреля 2019

Ваш вопрос кажется немного запутанным.Требования не очень ясны, несмотря на то, что вы указали «фактическую строку» и «ожидаемый результат».

Этот код должен обеспечить что-то очень близкое к тому, что вы хотите:

#!/usr/bin/perl

use strict;
use warnings;

open FILE, "<", "test.html" or die $!;

while (my $fileline = <FILE>) {
    while ($fileline =~ m/test_example_start(.*?)text_example_end(.*?)((?=test_example_start)|($))/gi) {
        print "first_part$1middle_part$1last_part$2";
    }
    print "\n";
}

close FILE;

Предполагая, что содержимое файла test.html следующее:

test_example_start это урок-1 text_example_end, где все посещали класс test_example_start, это урок-2 text_example_end, где два члена посещали класс test_example_start thisэто урок-3 text_example_end, в котором пять участников посетили класс

, тогда вышеприведенный сценарий будет иметь следующий вид:

first_part это урок-1 middle_part это урок-1last_part, где все учились в классе first_part, это урок-2 middle_part, это урок-2 last_part, где два участника посещали урок first_part, это урок-3 middle_part, это урок-3 last_part, где пять участников посещали урок

Я не уверен, что это то, что тынет, потому что я не знаю, что именно вы хотите вставить во вновь созданный middle_part

Помимо исправления в вашем регулярном выражении и очистки кода, ключевой момент здесь заключается в том, что если выЕсли вы хотите заменить все вхождения строки, тогда вы должны поместить тест строки внутри блока while, а не if.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...