sed: hapus semua kemunculan string kecuali yang pertama

14

Saya memiliki logfile dengan cap waktu di dalamnya. Kadang-kadang ada beberapa cap waktu dalam satu baris. Sekarang saya ingin menghapus semua cap waktu dari satu baris tetapi tetap yang pertama.

Saya bisa melakukan s/pattern//2tetapi itu hanya menghilangkan kejadian kedua dan sedtidak mengizinkan sesuatu seperti s/pattern//2-.

Ada saran?

Folkert van Heusden
sumber
Saya harus mengatakan bahwa itu sed dari busybox. Maaf untuk itu.
Folkert van Heusden

Jawaban:

4

Dengan GNU sed:

sed 's/pattern//2g'

Yang 2menentukan bahwa pola kedua dan semua yang lain gharus dihapus. Jadi ini akan menjadi yang pertama.

αғsнιη
sumber
1
Yang dimiliki Cygwin (port, tampaknya) dan MacOS tidak. Achh! Solusi ini jauh lebih elegan.
r_alex_hall
7

Ini harus bekerja (ganti _ dengan yang lain jika berbenturan dengan log Anda):

sed -e 's/pattern/_&/1' -e 's/\([^_]\)pattern//g' -e 's/_\(pattern\)/\1/'
Jlliagre
sumber
1
jika Anda menginginkan pembatas unik, gunakan \n.
mikeserv
5
sed -e ':begin;s/pattern//2;t begin'

atau tanpa sed goto:

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

Solusi umum untuk menghapus dari posisi ke-3 (misalnya) adalah:

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//'
jfg956
sumber
1

Sedikit variasi pada jawaban @ jillagre (dimodifikasi untuk ketahanan) dapat terlihat seperti:

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

... tetapi dalam beberapa seds Anda mungkin perlu mengganti ndi sisi kanan s///pernyataan ubstitusi pertama dengan \nkarakter ewline literal .

mikeserv
sumber