使用Perl,如何搜索字符串然后在其后添加一个不同的字符串?

时间:2015-07-27 07:48:49

标签: perl scripting

我对Perl有点麻烦。绝望如何进行这种非常简单的搜索,然后在匹配后添加一个新行。

例如,在我的文件中,我将搜索一个名为“TSET”的重复字符串,然后在该行之后,我将不得不添加一个不同的标签,如“tset0:”(当然是新的一行),它需要增加对于下一场比赛,它将添加“tset1:”,但它始终是相同的搜索字符串“TSET”。

文件如下所示:

V { allFuncPins = 0XXX0X  XX0XXX  100 XXX XXX XX   ; }
V { allFuncPins = 1XXX0X  XX0XXX  100 XXX XXX XX   ; }
V { allFuncPins = 0XXX0X  XX0XXX  100 XXX XXX XX   ; }
V { allFuncPins = 0XXX0X  XX0XXX  000 XXX XXX XX   ; }
V { allFuncPins = 0XXX0X  XX0XXX  100 011 XXX XX   ; }

//       pattern 0
W "tset1";
V { allFuncPins = XXXXXX  XXXXXX  110 011 XXX XX   ; }
V { allFuncPins = XXXXXX  011000  111 011 XXX XX   ; }
V { allFuncPins = XXXXXX  000000  111 011 XXX XX   ; }
V { allFuncPins = 0XXX0X  XX0XXX  100 XXX XXX XX   ; }
V { allFuncPins = 1XXX0X  XX0XXX  100 XXX XXX XX   ; }
V { allFuncPins = 0XXX0X  XX0XXX  100 XXX XXX XX   ; }
V { allFuncPins = 0XXX0X  XX0XXX  000 XXX XXX XX   ; }
V { allFuncPins = 0XXX0X  XX0XXX  100 011 XXX XX   ; }

//       pattern 0
W "tset1";
V { allFuncPins = XXXXXX  XXXXXX  110 011 XXX XX   ; }
V { allFuncPins = XXXXXX  011000  111 011 XXX XX   ; }
V { allFuncPins = XXXXXX  000000  111 011 XXX XX   ; }

所以在每个W“tset1”之后;我需要添加一个新行: Pattern0:

提前感谢提示。

4 个答案:

答案 0 :(得分:1)

你的描述还不清楚 - 你在搜索tset或TSET吗?你用tset0或Pattern0替换它吗?

但这似乎很简单。您应该能够根据自己的需要进行调整。

#!/usr/bin/perl

use strict;
use warnings;

my $count = 0;

while (<>) {
  if (/TSET/) {
    print "Pattern$count:\n"
    ++$count;
  }
  print;
}

它从STDIN读取并写入STDOUT。所以你可以这样称呼它:

$ ./this_script.pl < your_input.dat > new_version.dat

答案 1 :(得分:0)

使用标志来确定先前遍历的行是否包含所需的字符串,然后使用条件。

#!/usr/bin/perl
use strict;
use warnings;
my $flag;
while (<DATA>){
    chomp;
    print $_;
    $flag = 0;
    if ($_ =~ /TSET/){
        $flag = 1;
    }
    print "\ntset0:\n" if $flag;
}

__DATA__
lorem posum lorem posum lorem posum TSET lorem posu
lorem posulorem posu lorem posulorem posu lorem posu
lorem posuTSET

答案 2 :(得分:0)

我已将您文件的给定内容复制到我的电脑本地文本文件中并在脚本下执行。

#!C:\Strawberry\perl\bin
use strict;
use warnings;
my $file = "C:/Users/hclabv/Desktop/Data.txt";

#Opening file to get the required data

my $pattern = 0;
open (FILE, "$file");
     while (<FILE>) {
           my $CurrentLine = $_;

#Creating new file
           open (FILE1, ">>NewData.txt");
           print FILE1 "$CurrentLine";
                if ($_ =~ /tset/) {
                    my $NewLine = "Pattern $pattern";
                    print FILE1 "$NewLine\n";
                    ++$pattern;
                 }
           close(FILE1);     
      }
 close(FILE);
 exit;

OUTPUT :生成包含以下数据的新文件(NewData.txt)。

V { allFuncPins = 0XXX0X  XX0XXX  100 XXX XXX XX   ; }
V { allFuncPins = 1XXX0X  XX0XXX  100 XXX XXX XX   ; }
V { allFuncPins = 0XXX0X  XX0XXX  100 XXX XXX XX   ; }
V { allFuncPins = 0XXX0X  XX0XXX  000 XXX XXX XX   ; }
V { allFuncPins = 0XXX0X  XX0XXX  100 011 XXX XX   ; }

//       pattern 0
W "tset1";
Pattern 0
V { allFuncPins = XXXXXX  XXXXXX  110 011 XXX XX   ; }
V { allFuncPins = XXXXXX  011000  111 011 XXX XX   ; }
V { allFuncPins = XXXXXX  000000  111 011 XXX XX   ; }
V { allFuncPins = 0XXX0X  XX0XXX  100 XXX XXX XX   ; }
V { allFuncPins = 1XXX0X  XX0XXX  100 XXX XXX XX   ; }
V { allFuncPins = 0XXX0X  XX0XXX  100 XXX XXX XX   ; }
V { allFuncPins = 0XXX0X  XX0XXX  000 XXX XXX XX   ; }
V { allFuncPins = 0XXX0X  XX0XXX  100 011 XXX XX   ; }

//       pattern 0
W "tset1";
Pattern 1
V { allFuncPins = XXXXXX  XXXXXX  110 011 XXX XX   ; }
V { allFuncPins = XXXXXX  011000  111 011 XXX XX   ; }
V { allFuncPins = XXXXXX  000000  111 011 XXX XX   ; }

如果您想在脚本执行时提供输入,请使用以下内容。

#!C:\Strawberry\perl\bin
use strict;
use warnings;
use File::Copy;

#Getting input file name
my $file = shift;

#just renaming the file

my $newfile = $file.".txt";
move($file,$newfile);
chomp($newfile);

#Opening file to get the required data

my $pattern = 0;
open (FIL, "$newfile");
while (<FIL>) {
       my $CurrentLine = $_;

#Creating new file
       open (FILE1, ">>$file");
       print FILE1 "$CurrentLine";
            if ($_ =~ /tset/) {
                my $NewLine = "Pattern $pattern";
                print FILE1 "$NewLine\n";
                ++$pattern;
             }
       close(FILE1);     
  }
 close(FIL);
 exit;

OUTPUT :将使用您在脚本执行时提供的相同文件名创建。在这里,我在CMD提示符下面给出了以下文件名。

>perl pat.pl Data.txt

生成的Data.txt文件,输出如下。

V { allFuncPins = 0XXX0X  XX0XXX  100 XXX XXX XX   ; }
V { allFuncPins = 1XXX0X  XX0XXX  100 XXX XXX XX   ; }
V { allFuncPins = 0XXX0X  XX0XXX  100 XXX XXX XX   ; }
V { allFuncPins = 0XXX0X  XX0XXX  000 XXX XXX XX   ; }
V { allFuncPins = 0XXX0X  XX0XXX  100 011 XXX XX   ; }

//       pattern 0
W "tset1";
Pattern 0
V { allFuncPins = XXXXXX  XXXXXX  110 011 XXX XX   ; }
V { allFuncPins = XXXXXX  011000  111 011 XXX XX   ; }
V { allFuncPins = XXXXXX  000000  111 011 XXX XX   ; }
V { allFuncPins = 0XXX0X  XX0XXX  100 XXX XXX XX   ; }
V { allFuncPins = 1XXX0X  XX0XXX  100 XXX XXX XX   ; }
V { allFuncPins = 0XXX0X  XX0XXX  100 XXX XXX XX   ; }
V { allFuncPins = 0XXX0X  XX0XXX  000 XXX XXX XX   ; }
V { allFuncPins = 0XXX0X  XX0XXX  100 011 XXX XX   ; }

//       pattern 0
W "tset1";
Pattern 1
V { allFuncPins = XXXXXX  XXXXXX  110 011 XXX XX   ; }
V { allFuncPins = XXXXXX  011000  111 011 XXX XX   ; }
V { allFuncPins = XXXXXX  000000  111 011 XXX XX   ; }

答案 3 :(得分:0)

如果您使用的是基于unix的服务器,那么这可以用一行编写。

cat test_file.txt | perl -ne 'print /^(W "tset1";)$/ ? "$1\npattern" . $count++ . ":\n" : "$_"'

然而,为了更好的布局和评论我已经放在脚本

use strict;
use warnings;

#take the file name from input and open it and initalise the counter as 0
my $file = shift || die "you need to give an input file";
open (my $fh, '<', $file) or die "Unable to open $file: $!";
my $count = 0;

#process each line and if the line matches our pattern tag on a new line and the pattern task to it otherwise just print the normal line.
while (<$fh>){
        print /^(W "tset1";)$/ ? "$1\npattern" . $count++ . ":\n" : "$_";
}