模式匹配并删除除最后一次出现的所有行

Posted

技术标签:

【中文标题】模式匹配并删除除最后一次出现的所有行【英文标题】:pattern matching and delete all the lines except the last occurence 【发布时间】:2013-03-15 23:29:51 【问题描述】:

我有一个包含 100 多行的 txt 文件,我想搜索模式并删除除最后一次出现之外的所有行。

这是 txt 文件中的行。

我的模式搜索是 "string1=" 、 "string2=" 、 "string3=" 、 "string4=" 和 "string5="

string1=hi
string2=hello
string3=welcome
string3=welcome1
string3=
string4=hi
string5=hello

我想遍历每一行并在文件中保持 "string3=" 为空并删除 "string3=welcome" ,"string3=welcome1"

请帮帮我。

【问题讨论】:

您必须编写一个程序来执行此操作。分享您目前编写的程序,并告诉我们您遇到的问题。 【参考方案1】:

对于单个模式,您可以从以下内容开始:

grep "string3" input | tail -1

【讨论】:

【参考方案2】:
#!/usr/bin/perl

my %h;

while (<STDIN>) 
  my ($k, $v) = split /=/;
  $h$k = $v;
  

foreach my $k ( sort keys %h ) 
  print "$k=$h$k";
  

这里的 perl 脚本会将您的列表作为标准输入并处理您提到的输出。这假设您希望键(字符串*)作为排序输出。

如果您只想要以 string1-5 开头的值,那么您可以在 while 循环的开头放置一个匹配项,如下所示:

next if ! /^string[1-5]=/;

【讨论】:

以上是关于模式匹配并删除除最后一次出现的所有行的主要内容,如果未能解决你的问题,请参考以下文章

删除文件中与模式不匹配的行

5.2.1 正则表达式语法与子模式扩展语法

正则表达式:匹配除特定模式之外的所有内容

正则表达式:匹配字符的第一次出现

仅匹配指定字符的最后一次出现的正则表达式

POSIX正则表达式中的环顾四周,以匹配除最后一个(对于gsub而言)以外的所有空格