使用 perl 命令仅替换字符串的最后一次出现

使用 perl 命令仅替换字符串的最后一次出现

我有一个 stdout 或一个文件并不重要:

mela
pera
banana
caffè
mela
pera
banana
caffè
mela
pera
banana
caffè

我只想删除最后一次出现的“ mela”,使用perl

mela
pera
banana
caffè
mela
pera
banana
caffè
pera
banana
caffè

我该怎么做?

答案1

perl -lwne '
    if ($_ eq "mela") {
        if ($i) {
            print for splice @buffer, 0, $i;
        }
        $i = 1+$#buffer;
    }
    push @buffer, $_;
    END {
        splice @buffer, $i, 1;
        print for @buffer;
    }'

-n逐行读取输入(文件或标准输入)。您不必打印每一行,而是将行推送到缓冲区。遇到时mela,让$i指向其在缓冲区中的位置。mela再次遇到时,打印缓冲区的第一部分直到上一个mela。在输入结束时,打印缓冲区除了对于最后一个mela被指向的$i

未针对边缘情况进行测试(多个melas 彼此跟​​随、mela在第一行/最后一行等)

答案2

在独立的 Perl 程序中:

#!/usr/bin/perl
# Desc: Repeat everything back, except last occurrence of given string
# Synt: $0 string <infile

## for each input record in reverse order,
##   if string not found before, and found now, set flag, else stack record
## print stack
$s = shift."\n";   # get string, append LF
for ( reverse <STDIN> ) {
    if ( !$f && $s eq $_ )  { $f=1          }
    else                    { unshift @o,$_ }
}
print @o;

或者作为高级用户的单行操作,实际操作如下:

$ echo -e "11\nmela\n22\nmela\n33" | perl -e '$s=shift."\n";
 !$f && $s eq $_ ? $f=1 : unshift @o,$_  for reverse <STDIN>;
 print @o;' mela
11
mela
22
33

相关内容