有条件地修改文件中的文本

时间:2014-03-05 16:00:00

标签: regex perl

我想在文本文件中修改一些多行字符串数据。我能够将整个文件内容读取到变量并捕获我感兴趣的数据部分。然后在单独的变量中修改其内容。我想将数据保存回文件。这是我的一个例子:

Value1: something 
        something else
Value2: something else 1
        something else 2
Value3: something else 4
        something else 5

这就是我想要实现的目标:

Value1: something 
        something else
Value2: MODIFIED DATA 1
        MODIFIED DATA 2
Value3: something else 4
        something else 5

这不是一个简单的正则表达式替换,因为我需要验证搜索文本的内容并有条件地修改它。

3 个答案:

答案 0 :(得分:1)

我不认为这是多线正则表达式的替代品。它是多行重复的替代品,可以通过触发器在单行中解决,如:

perl -i.bak -pe '
  if ( $ff = (m/^Value2:/ ... /^\S/) ) { 
    unless ( $ff =~ m/E0$/ ) { 
      s/something else/MODIFIED DATA/ 
    } 
  }
' infile

它对以Value2:开头的另一行和以非空白字符开头的所有行应用替换命令。

上一个命令产生:

Value1: something
        something else
Value2: MODIFIED DATA 1
        MODIFIED DATA 2
Value3: something else 4
        something else 5

答案 1 :(得分:0)

所以,你想从

开始
Value2: something else 1
        something else 2

Value2: MODIFIED DATA 1
        MODIFIED DATA 2

此正则表达式为/Value2:\s*(.*?)\s*\n\s*(.*?)\s*\n/m,假设您知道Value2将其放入正则表达式,而您的“其他内容”不包含\n。如果没有关于数据的更多细节,很难提供更多帮助。

答案 2 :(得分:0)

在脚本中使用就地编辑器。

use strict;
use warnings;
use autodie;

my $filename = 'some_file.txt';

# For Testing - Initialize file with fake data.
open my $fh, '>', $filename;
$fh->print(<DATA>);
close $fh;

# Use In-place editor
my $section = 'Value2';
my $newtext = "Value2: MODIFIED DATA 1\n        MODIFIED DATA 2\n";
{
    local @ARGV = ($filename);
    local $^I = '.bac';

    while (<>) {
        if ( my $linenum = /^$section:/ ... /^\S/) {
            unless ($linenum =~ /E0/) { # Skip next section
                # Replace first line with entire new text, gobble other lines
                $_ = $linenum == 1 ? $newtext : '';
            }
        }
        print;
    }

    unlink "$filename$^I";
}

# For Testing - Print results of file.
print "Results:\n";
open $fh, '<', $filename;
print(<$fh>);
close $fh;

1;

__DATA__
Value1: something 
        something else
Value2: something else 1
        something else 2
        something else 3
Value3: something else 4
        something else 5