使用perl替换文件行中多次出现的单词

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (52)

需要替换文本文件行中多次出现的单词

#!/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
提问于
用户回答回答于

你的问题似乎有点令人困惑。尽管您提供了“实际字符串”和“预期结果”,但要求并不十分清楚。

此代码应提供非常接近您想要的内容:

#!/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这是第3课text_example_end,其中有5名成员参加了课程

那么,上面脚本的输出将是:

first_part这是第1课mid_part这是第1课last_part,每个人都上课了first_part这是第2课mid_part这是第2课last_part其中两名成员参加了课程first_part这是第3课mid_part这是第3课last_part其中五名成员上课

我不确定这是不是你想要的,因为我不知道你想要在新创建的内容中插入什么 middle_part

除了你的正则表达式的修正和代码清理之外,这里的关键点是,如果你想要替换所有行的发生,那么你应该将行测试放在一个while块中,而不是一个if

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励