使用sed、awk、p删除N个匹配模式

2024-06-16 09:23:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这种情况,文件包含

abcd
line1
line2
line3
vwxyz
abcd
vwxyz
abcd
vwxyz
abcd
vwxyz
line4
line5

每当我找到匹配的2行

abcd
vwxyz

删除以使其成为

abcd
line1
line2
line3
vwxyz
line4
line5

我已经搜索了很多关于模式匹配的建议,但是从来没有遇到过2行模式匹配

我已经做了三次了,但是没有像预期的那样成功。。。你知道吗

任何使用awk、sed、perl、pyhon等的帮助都是非常感谢的


Tags: 文件情况sed建议perlabcdawkline1
3条回答

使用Perl,最简单的解决方案是将整个输入加载到内存中。你知道吗

perl -0777pe's/abcd\nvwxyz\n//g'

如果一次读取一行,这些类型问题的一般解决方案是保留过去行的缓冲区。你知道吗

if (!eof()) {
   my @buf = scalar(<>);
   while (<>) {
      if ($buf[-1] =~ /^abcd$/ && /^vwxyz$/) {
         @buf = ();
      } else {
         print(shift(@buf));
         push(@buf, $_);
      }
   }

   print @buf;
}

这可能适用于您(GNU-sed):

sed 'N;/^abcd\nvwxyz$/d;P;D' file

在整个文件长度中创建一个两行窗口,如果当前窗口与所需字符串匹配,则删除该窗口。否则,打印/删除窗口的第一行并附加另一行,重复。你知道吗

这可以扩展到匹配n行:

sed ':a;N;s/[^\n]\+/&/2;Ta;/^abcd\nvwxyz$/d;P;D' file

概括为2行:

或:

sed ':a;N;s/[^\n]\+/&/3;Ta;/^line1\nline2\nline3$/d;P;D' file

三条线等

另一种选择:

sed -z 's/^abcd\nvwxyz\n//mg' file

你是说这样的事?你知道吗

sed '/abcd/{N;/vwxyz/d}' yourdata.file

解释

/abcd/    # search first Pattern
{
N;        # if match read next line
/vwxyz/d  # if second pattern match then delete line
}

相关问题 更多 >