我想在文本文件中修改一些多行字符串数据。我能够将整个文件内容读取到变量并捕获我感兴趣的数据部分。然后在单独的变量中修改其内容。我想将数据保存回文件。这是我的一个例子:
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
这不是一个简单的正则表达式替换,因为我需要验证搜索文本的内容并有条件地修改它。
答案 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