Memfilter input dengan sed (regex)


1

Saya mengalami masalah dengan sed tidak mengembalikan apa yang saya harapkan ketika menggunakan pola regex untuk membersihkan beberapa output dari permintaan mysql.

mysql -uroot -p -e 'SELECT `path` FROM db.media_gallery' | sed -n -r 's/[^\/]+([^\s]+).*/\1/p'

Kueri mengembalikan banyak baris seperti ini:

| /media/M/W/lmt_MWS04_8.png    |
| /media/M/W/lmt_MWS02_11.png   |

Ketika saya mem-pipe ini melalui perintah sed yang tercantum di atas, ia mengembalikan ini:

//M/W/lmt_MWS04_8.png
//M/W/lmt_MWS02_11.png

Kemana perginya "media"? Mengapa itu menghapus bagian dari string saya secara acak?

Adakah yang tahu cara memperbaiki regex saya?


"media" hilang karena cocok dengan [^\/]+ bagian dari regex Anda, yang tidak termasuk dalam output Anda. Kami tidak dapat memperbaiki regex Anda kecuali kami tahu apa yang Anda coba lakukan. Apakah Anda mencoba untuk memotong spasi?
wingedsubmariner

Jawaban:


3

Tidak perlu sed, masalah sebenarnya adalah Anda menggunakan output yang sudah dipersonalisasi mysql yang ditujukan untuk konsumsi manusia dan bukan otomatis. Ini adalah tugas sederhana yang mysql lebih dari mampu.

mysql -N -s -r -uroot -p -e 'SELECT `path` FROM db.media_gallery'

akan kembali:

/media/M/W/lmt_MWS04_8.png
/media/M/W/lmt_MWS02_11.png

dari 'man mysql':

--skip-column-names, -N
--silent, -s
--raw, -r

0

"Media" cocok dengan "[^ /] +" sehingga digantikan oleh hal-hal di dalam tanda kurung. Jika Anda menginginkannya, Anda harus membuka tanda kurung sebelum klausa regex itu.

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.