sed Command on BusyBox mengharapkan sintaks yang berbeda?

5

Saya harap saya mengutarakan pertanyaannya dengan benar. Saya punya skrip yang banyak menggunakan 'sed'. Ini berfungsi dengan baik di ubuntu saya dengan 'sed' GNU. Tetapi ketika saya mencoba menjalankannya di BusyBox gagal. Apakah ada cara untuk mendapatkan sed GNU di busybox? Saya bukan pro Linux.

tzippy
sumber
Apakah Anda sudah menginstal di busybox?
jokerdino
1) Apa versi Busybox? 2) Apa kesalahan / output tak terduga yang Anda dapatkan? 3) Bisakah Anda memberi kami contoh operasi sed yang bekerja dengan GNU tetapi tidak busybox?
RI Swamp Yankee
1) BusyBox v1.19.4 2/3) Input ini {"expires": "Thu, 11 Oct 2012 11:30:29 +0000", "upload_id": "hhgJHflih753jDhhod", "offset": 293876}dengan sed -n -e 's/.*"upload_id":\s*"*\([^"]*\)"*.*/\1/p'memberikan output yang diinginkan (hhgJHflih753jDhhod) di ubuntu saya tetapi tidak pada BusyBox
tzippy

Jawaban:

5

The BusyboxIteself mungkin memiliki implementasi terbatas sed. Anda dapat menyalin sedbiner ke beberapa lokasi dan memohonnya langsung menunjuknya dengan path lengkap.

Anda dapat memperbaiki beberapa masalah ketidakcocokan dengan mengganti lolos yang sedtidak didukung oleh BusyBox builtin , misalnya mengganti \spelarian dengan [[:space:]]akan menyelesaikan masalah pencocokan ruang.

Serge
sumber
komentar dihapus, salah ditempatkan.
tzippy
ganti \smelarikan diri dengan [[:space:]]. Saya pikir ini akan menyelesaikan masalah Anda
Serge
Serge terima kasih! Benar-benar berhasil! Meskipun ada lokasi lain di skrip tempat mengganti \stidak membantu. Jika Anda memposting ini sebagai jawaban, saya akan senang menerimanya!
tzippy
@ tzippy Ketika Anda menghapus komentar Anda dengan regexp Anda, saya hanya menambahkan catatan untuk jawabannya.
Serge
2

Anda sepertinya salah paham bagaimana cara busyboxkerjanya. Alat ini adalah satu yang dapat dieksekusi tunggal yang bertindak dengan cara berbeda tergantung pada nama (atau sub-perintah) yang dengannya ia dipanggil. Jika Anda memanggil symlink yang sedmenunjuk ke busyboxbiner (atau busybox sed), fungsionalitas "sed" akan dieksekusi.

Untuk mendapatkan sed GNU ke lingkungan busybox, Anda harus menghapus sedsymlink busyboxdan menyediakan sedbiner GNU dan pustaka yang bergantung padanya. Anda dapat mengidentifikasi perpustakaan dengan lddperintah:

$ ldd /bin/sed
    linux-gate.so.1 =>  (0xb7f78000)
    libselinux.so.1 => /lib/libselinux.so.1 (0xb7f56000)
    libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7e0f000)
    libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb7e0a000)
    /lib/ld-linux.so.2 (0xb7f79000)
Ansgar Wiechers
sumber
1
Oh, aku tidak tahu itu sebenarnya! Terima kasih telah menunjukkannya!
tzippy
1
Saya baru saja mengganti sed dari busybox dengan mengunduh paket sed dengan opkg. yang ini tampaknya adalah sed GNU.
tzippy