我有一个 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
。
未针对边缘情况进行测试(多个mela
s 彼此跟随、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