我正在寻找一个正则表达式删除X行时,* 立即 * 后面跟着Y行。我已经尝试了这个在一个foreach
(文件以前收集)
foreach my $file (@files) {
say "Processing $file in $dir";
open( my $fh, "<", "$file" )
or die "Can't open < $file: $!";
my $data = {};
my $start = "X:";
my $end = "Y:";
my $contents = do { local $/; <$fh> };
my $count = 1;
my $transformed = $contents;
while ( $contents =~ /$start(.*?)$end/sg ) {
say $1 if $1;
my $formatted = $1;
$formatted =~ s/\s+//g if $formatted;
$data->{$file}->{$formatted} = $count++ if $formatted;
$transformed =~ /($start.*?$end)/sg;
my $removed = quotemeta($1) if $1;
$transformed =~ s/$removed/$end/sg if $removed;
}
push @results, $data if ($data);
path($file)->spew_utf8($transformed);
}
但无法使其忽略下面的“忽略示例”。
要行程的文字(Y * 紧接在X之后 *):
{
X: John Smith,
Y: 1234 Main Street
}
变成
{
Y: 1234 Main Street
}
要忽略的文本(Y不 * 紧接 * 在X之后):
{
X: John Smith,
X2: 1234567890,
Y: 1234 Main Street
}
1条答案
按热度按时间a2mppw5e1#
您可以使用下列项目:
这是
g
可用于删除多个匹配项。您不希望将
s
与第一个一起使用,因为s
会更改.
的定义。