sed:最初の文字列を除くすべての文字列を削除します。

sed:最初の文字列を除くすべての文字列を削除します。

タイムスタンプを含むログファイルがあります。時には複数のタイムスタンプが連続していることもあります。今行からすべてのタイムスタンプを削除し、最初のタイムスタンプを維持したいと思います。

私はこれを行うことができますが、これを行うとs/pattern//22番目の項目だけが削除され、sed同様の項目は許可されませんs/pattern//2-

どんな提案がありますか?

答え1

GNUの使用sed:

sed 's/pattern//2g'

22番目のパターンと残りのすべてのパターンを削除することを指定しますg。したがって、最初の項目が保持されます。

答え2

これはうまくいきます(ログと競合する場合は_を別のものに置き換えます)。

sed -e 's/pattern/_&/1' -e 's/\([^_]\)pattern//g' -e 's/_\(pattern\)/\1/'

答え3

sed -e ':begin;s/pattern//2;t begin'

またはsed gotoを使用せずに:

sed -e 's/\(pattern\)/\1\n/;h;s/.*\n//;s/pattern//g;H;g;s/\n.*\n//'

n番目(例:3)の場所から削除する一般的な解決策は次のとおりです。

sed -e ':begin;s/pattern//4;t begin'
sed -e 's/\(pattern\)/\1\n/;h;s/.*\n//3;s/pattern//g;H;g;s/\n.*\n//'

答え4

@jillagreの答えは少し異なります。(堅牢性のために修正)次のように見えます。

sed 's/p\(attern\)/p\n\1/;s///g;s/\n//'

...しかし、場合によっては、最初の交換文の右側をリテラルewline文字に置き換えるsed必要があります。ns///\n

関連情報