如何删除文件中的所有行直到它与字符串行模式匹配?

如何删除文件中的所有行直到它与字符串行模式匹配?

如何删除文件中的行直到它与字符串行模式匹配?

cat test.txt
The first line
The second line
The third line
The fourth line
pen test/ut
The sixth line
The seventh line

我想使用 shell/python 脚本删除上述文件中的所有行,直到它与文件字符串模式“pen test”匹配

预期输出:删除上述行后,文件“test.txt”应仅包含这些行:

The sixth line
The seventh line

答案1

使用 GNU sed:删除第一个匹配项之前的所有内容并就地修改文件:

sed -i '0,/pen test/d' test.txt

答案2

你可以这样做:

cat test.txt | grep -A2 "pen test/ut" | sed "1 d"
The sixth line
The seventh line

答案3

您可以使用实用程序sed并按Perl如下方式执行此操作:

perl -ne '
  next unless /pen/;  #  skip till we meet the first interesting record
  print <>;           # <> in the list context, fetches the entire remaining file
' input-file.txt

sed -ne '
   /pen/!d
   n
   :loop
      $!N;P;s/.*\n//
   tloop
' input-file.txt

sed -ne '
   /pen/!d  ;# reject lines till we see the first interesting line
   n        ;# skip the first time we see the interesting line
   :n       ;# then setup a do-while loop which"ll do a print->next->print->... till eof
      p;n   ;# the looping ends when the n command tries to read past the last record
   bn
' input-file.txt

答案4

使用 Perl:

perl -ni.bck -e '$i++,next if /^pen test/;print if $i' file

这会读取您的输入文件并进行就地更新。原始文件以后缀扩展名保留.bck

当读取文件的每一行时,$i如果一行以 开头pen test并且读取下一行,则会设置一个标志 。当$i不为零(真实条件)时,将打印行。

如果您只想提取感兴趣的行而不更新,只需执行以下操作:

perl -ne '$i++,next if /^pen test/;print if $i' file

相关内容