Perl:对文本文件中单词的每个实例进行编号

时间:2016-08-02 17:54:25

标签: perl text

我需要编辑一个格式如下的文本文件:

> Word text text text text
Text
Text
> Word text text text text
Text
Text

让它看起来像:

>Word1 text text text text
Text
Text
>Word2 text text text text
Text
Text

基本上,我需要修改字符串的每个实例"字"把它变成" Word"后跟一个数字,该数字对应于字符串到目前为止在文本文件中出现的实例数。我是perl的新手,不知道我在做什么。这就是我所拥有的:

$file = "test.txt";

my %count;
my $word = " Word";

#Open and read data
open (FILE, "<$file") or die "Cannot open $file: $!\n";
@lines= <FILE>;
foreach my $word{
    my $count++;
}
close FILE;

my $counter = my $count + 1;
my $curr_ct = my $counter - my $count;

#Open same file for editing now
open (STDOUT, ">$file") or die "Cannot open $file: $!\n";


while (my $count > 0){
    s/ Word/Word$curr_ct/
    my $count--;
    my $curr_ct = my $counter - my $count;
    print;
}

close STDOUT;

2 个答案:

答案 0 :(得分:5)

没有理由使用(?{ })。使用/e时,替换表达式将被评估为每个匹配的Perl代码。这就是你需要的全部。

#!/usr/bin/perl

use strict;
use warnings;

my $word = 'Word';

my $count;
while (<>) {
    s/\b\Q$word\E\b/ $word . ++$count /eg;
    print;
}

5.10引入\K,这可以使关键线更短!

s/\b\Q$word\E\b\K/ ++$count /eg;

其他改进:

  • \b使其swordwordy不匹配。
  • \Q .. \E使$word可以安全地包含非单词字符。

答案 1 :(得分:-1)

您可以在正则表达式中使用零宽度code evaluation expression断言,例如:(?{...})来增加每个匹配的计数值,然后在替换端使用该计数:

请注意,根据文档,代码评估表达式被认为是实验性的。

use warnings;
use strict;

my $word = 'Word';
my $file = 'file.txt';

open my $fh, '<', $file or die $!;

my $count;

while (<$fh>){
    s/$word(?{$count++})/$word$count/g;
    print;
}

输入:

> Word text text text text
Text
Text
> Word text text text text
Text
Text

输出:

> Word1 text text text text
Text
Text
> Word2 text text text text
Text
Text