タイムスタンプを含むログファイルがあります。時には複数のタイムスタンプが連続していることもあります。今行からすべてのタイムスタンプを削除し、最初のタイムスタンプを維持したいと思います。
私はこれを行うことができますが、これを行うとs/pattern//2
2番目の項目だけが削除され、sed
同様の項目は許可されませんs/pattern//2-
。
どんな提案がありますか?
答え1
GNUの使用sed
:
sed 's/pattern//2g'
2
2番目のパターンと残りのすべてのパターンを削除することを指定します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
必要があります。n
s///
\n