次のログがあります。
2016/01/20 00:00:16.035 [T114BaseServlet] ... Blah Blah Blah
2016/01/20 00:00:16.036 [ApplicationState] ... Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
2016/01/20 00:00:29.531 [T114BaseRequestPayloadParser] ... Blah Blah Blah
2016/01/20 00:00:36.036 [ApplicationState] ... Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
この行を削除したいのですが、ApplicationState
この行の末尾にパターンはありませんBlah Blah Blah
。
私が削除したいブロックは次のとおりです。
2016/01/20 00:00:16.036 [ApplicationState] ... Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
次の要求が始まる前に。
答え1
一致の前に表示される行を含む、1から始まる行のブロック全体を次の行が表示されるまで削除するには、[T1114Base
次のようにします。
sed -e'$!N;/ApplicationState.*\n/,/\n.*\[T1114Base/!P;D' <in >out
これがどのように機能するかを理解するのは非常に簡単です。デフォルトでは、sed
入力は一度に1行ずつ食べます。しかし、より広い視点が必要な場合は、スクリプトを書くだけです。
!
したがって、入力ラインごとに現在の行が最後の行ではない場合、挿入された改行文字で区切られたパターンスペースに追加の行が$
追加されます。sed
N
\n
範囲式で最初に一致する項目を探します。ApplicationState
その後には*
任意の数の.
文字が続き、その後には少なくとも1つの行が\n
続きます。範囲式を終了するには、$!N
まず目的の入力を調べる必要があります。sed
次の行の発生をスキャンします。後ろに最後に削除するアイテムです。\n
次の入力ブロックの先頭に一致する必要があるパターンが続くewlineを見つけます。
範囲式が!
一致しない場合、パターンスペースから最初の改行文字が印刷さsed
れ、一致するかどうかにかかわらず、パターンスペースから最初の改行が削除され、次のようにスクリプトの先頭にリサイクルされます。残り。P
\n
sed
D
sed
デフォルトで入力された2行を同時にP
スワイプすると、削除ブロックに表示されない場合は最も古い行が印刷され、D
拡張を追加する前に常に最も古い行のみが削除されますN
。
答え2
本当に試してみましたか?
行全体を削除するとします。
sed '/ApplicationState/d' inputfile