perl 用于在X行后面紧跟Y行时删除X行的正则表达式

n53p2ov0  于 2022-11-15  发布在  Perl
关注(0)|答案(1)|浏览(125)

我正在寻找一个正则表达式删除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
}
a2mppw5e

a2mppw5e1#

您可以使用下列项目:

s/^X:.*\n(?=Y:)//m;

这是

s/^X:[^\n]*\n(?=Y:)//m;

g可用于删除多个匹配项。
您不希望将s与第一个一起使用,因为s会更改.的定义。

相关问题