sed: bir dize dışında bir dizenin tüm tekrarlarını sil


14

İçinde zaman damgaları olan bir günlük dosyası var. Bazen bir satırda birden çok zaman damgası vardır. Şimdi tüm zaman damgalarını bir satırdan kaldırmak ama ilkini tutmak istiyorum.

Yapabilirim s/pattern//2ama bu sadece ikinci olayı kaldırır ve sedböyle bir şeye izin vermez s/pattern//2-.

Herhangi bir öneri?


Meşgul kutusunun sed olduğunu söylemeliydim. Bunun için özür dilerim.
Folkert van Heusden

Yanıtlar:


4

GNU ile sed:

sed 's/pattern//2g'

2Belirtir, ikinci desen ve her şey o gkaldırmalısınız. Yani bu birincisini koruyacak.


1
Hangi Cygwin (görünüşte bir bağlantı noktası) var ve MacOS yok. Achh! Bu çözüm çok daha zarif.
r_alex_hall

7

Bu işe yaramalıdır (_'i günlüklerinizle çakıştığında başka bir şeyle değiştirin):

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

1
Eğer benzersiz bir sınırlayıcı istiyorsanız, kullanın \n.
mikeserv

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

veya sed goto olmadan:

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

N. (Örneğin 3) konumundan kaldırılacak genel çözümler şunlardır:

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'nin cevabında (sağlamlık için değiştirilmiş) küçük bir değişiklik şöyle görünebilir:

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

... ama bazı seds değiştirmek gerekebilir nilk sağ tarafında s///bir hazır olan ubstitution açıklamada \newline karakteri.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.