使用perl脚本在文件中的特定位置插入行

时间:2017-12-11 12:33:15

标签: regex perl perl-module

想要使用perl脚本在文件中添加新行。我试过但没有运气

 if($correctedContents[$i] ~= /second line/){
 @data = $correctedContents[$i]
  push (@data, '\n TEST Line');

例如:每当找到“第二行”行时,将“TEST Line”添加到文件中。

FILE1.TXT,

first line
second line
third line

first line 
second line 
third line

.....

添加新行后 预期产出:

first line
second line
TEST Line
third line

first line 
second line 
TEST Line
third line

先谢谢

2 个答案:

答案 0 :(得分:2)

您还没有向我们展示足够的代码,以便我们提供更多帮助。但是,特别是,您没有显示将更改的数据写回输出文件的任何代码。

一般来说,这样的任务归结为三个阶段:

  1. 从文件中读取数据。
  2. 以某种方式更新数据。
  3. 将更改的数据写回文件。
  4. 一种常见的方法是打开两个文件句柄 - 一个用于输入文件,另一个用于新的输出文件。这使得一次处理文件变得简单。

    while (<$input_fh>) {
      if (this is a line you need to change) {
        # make changes to line (which is in $_)
        # Perhaps print an extra line here.
      }
      print $output_fh $_;
    }
    

    另一种方法(易于使用的速度)是使用Tie::File模块(自5.8以来所有Perl发行版的一部分)。

    与往常一样,Perl FAQ是获取更多信息的好地方。在这种情况下,您可能希望查看perlfaq5,其中包含问题How do I change, delete, or insert a line in a file, or append to the beginning of a file?

    更新:您已经有一个(稍有问题)基于Tie :: File的解决方案。所以这是我的:

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    
    use Tie::File;
    
    tie my @lines, 'Tie::File', 'somefile.txt'
      or die "Can't tie file: $!\n";
    
    for (@lines) {
      $_ .= "\nTEST line" if $_ eq 'second line';
    }
    

答案 1 :(得分:0)

您可以使用Tie::File获得您期望的输出

use Tie::File;

my $inputFile = "test.txt";

my @array;
tie @array, 'Tie::File', $inputFile or die "Error: Couldn't tie the \"$inputFile\" file: $!";
my $len = join "\n", @array;

if($len=~m/second line/i) {  $len=~s/second line/$&\nTEST Line/ig;  }

@array = split/\n/, $len;
untie @array;

Tie::File将替换同一输入文件中的字符串。