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?
[^\/]+
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?Jawaban:
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.
akan kembali:
dari 'man mysql':
sumber
"Media" cocok dengan "[^ /] +" sehingga digantikan oleh hal-hal di dalam tanda kurung. Jika Anda menginginkannya, Anda harus membuka tanda kurung sebelum klausa regex itu.
sumber