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?


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.


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

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

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 .

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.