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


14

タイムスタンプ付きのログファイルがあります。1行に複数のタイムスタンプがある場合があります。次に、行からすべてのタイムスタンプを削除しますが、最初のタイムスタンプを保持します。

私はできますs/pattern//2が、それは2番目の出現を削除するだけで、のsedようなものは許可しませんs/pattern//2-

助言がありますか?


busyboxのsedであると言ったはずです。そのために残念。
フォルケルトヴァンフースデン

回答:


4

GNUの場合sed

sed 's/pattern//2g'

2第二のパターンとすべての残りの部分があることを指定しg削除する必要があります。したがって、これは最初のものを保持します。


1
Cygwinには(明らかにポートの)ポートがあり、MacOSにはありません。ああ!このソリューションは非常にエレガントです。
-r_alex_hall

7

これは機能するはずです(ログと衝突する場合は、_を他のものに置き換えてください):

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

1
一意の区切り文字が必要な場合は、を使用します\n
mikeserv 14

5
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//'

1

@jillagreの回答のわずかなバリエーション(堅牢性のために修正)は次のようになります。

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.