文字列行パターンと一致するまでファイル内のすべての行を削除する方法は? [コピー]

文字列行パターンと一致するまでファイル内のすべての行を削除する方法は? [コピー]

文字列行パターンと一致するまでファイルの行を削除する方法は?

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

シェル/Pythonスクリプトを使用して、ファイル文字列パターン「ペンテスト」と一致するまで、上記のファイルのすべての行を削除したいと思います。

期待される出力:上記の行を削除した後、「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 -ni.bck -e '$i++,next if /^pen test/;print if $i' file

これにより、入力ファイルが読み取られ、その場所で更新されます。元のファイルはサフィックス拡張子で保存されます.bck

ファイルの各行を読み取るときに1$i行が次に始まり、次の行を読み取るとpen testフラグが設定されます。ゼロでない場合$i(真の条件)、対応する行が印刷されます。

更新せずに関心のある行のみを抽出するには、次の手順を実行します。

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

関連情報