開始パターンと終了パターンの間の最後の行シーケンスを印刷するには?

開始パターンと終了パターンの間の最後の行シーケンスを印刷するには?

この質問に対する答え:

開始パターンと終了パターンの間の行を見つける方法は?

一致するパターン間の複数の行シーケンスは気にしません。例えば、sed -n '/startpattern_here/,/endpattern_here/p'これらのパターンが現れる間に一連の複数行が印刷される。

しかし、単に印刷したいとしましょう。最後ファイルにこれらの順序があります。 sedを使用してこれを実行できますか?そうでなければ、おそらく奇妙に思えますか?他にはありませんか?

メモ:

  • これらのシーケンスは重複しないと仮定することができる。
  • 開始および終了パターンラインしなければならない出力に含まれます。
  • 複雑さの低いパターンを想定する答えも有効です(最適ではありませんが)。

ベストアンサー1

完全正規表現テストが必要な場合は、次のように動作します。

awk '/startpattern_here/ {buf="";f=1}
     f{buf=buf $0 "\n"}
     /endpattern_here/ {f=0; lastcomplete=buf}
     END{printf("%s",lastcomplete)}' file.txt

これにより、完全な開始 - 停止パターンのみが印刷されます。

テストケース:

irrelevant
irrelevant
irrelevant
startpattern_here
relevant_but_dont_show_1
relevant_but_dont_show_1
relevant_but_dont_show_1
endpattern_here

irrelevant
irrelevant
 
startpattern_here
relevant_but_dont_show_2
relevant_but_dont_show_2
relevant_but_dont_show_2
endpattern_here

irrelevant
irrelevant

startpattern_here
relevant_and_show
relevant_and_show
relevant_and_show
endpattern_here

irrelevant
startpattern_here
incomplete_dont_show

結果:

startpattern_here
relevant_and_show
relevant_and_show
relevant_and_show
endpattern_here

ノート開始モードと終了モードの出力を抑制するには、sumsルールを変更するだけです/startpattern_here/ { ... }/endpattern_here/ { ... }つまり、「終了モード」ルールを最初に配置し、END次に「開始モード」ルールを配置するだけです。

おすすめ記事