Saya mencoba memformat ulang file log sehingga tanggal dan waktu muncul di awal baris. Log saya terlihat seperti ini:
blah, blah, blah, Friday, Mar 13,2015 16:59:42
yadi, yadi, yada, Friday, Mar 13,2015 16:51:11
Saya ingin mereka terlihat seperti ini:
Friday, Mar 13,2015 16:59:42 blah, blah, blah
Friday, Mar 13,2015 16:51:11 yadi, yadi, yada
Saya telah melangkah lebih jauh untuk menemukan pola grep yang tepat dengan grep -o -i -e '[a-zA-Z]*, [a-z][a-z][a-z] [0-9]*,[0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]' ~/log.txt
.
Bagaimana saya bisa memindahkan hasil pola ini ke kiri string informasi? Terima kasih atas bantuan Anda.
Jawaban yang Diterima:
Coba sed
dengan ekspresi reguler berikut:
$ sed -i.bak 's_\(.*\),[[:blank:]]\([[:alpha:]]\+,[[:blank:]][[:alpha:]]\+[[:blank:]][[:digit:]]\+,[^,]\+$\)_\2 \1_' file.txt
Friday, Mar 13,2015 16:59:42 blah, blah, blah
Friday, Mar 13,2015 16:51:11 yadi, yadi, yada
Di sini kita telah menggunakan sed
metode substitusi grup untuk mendapatkan output yang diinginkan.
\(.*\)
akan cocok hinggablah, blah, blah
seperti yang kita miliki,[[:blank:]]
untuk mencocokkan,
setelah itu.\([[:alpha:]]\+,[[:blank:]][[:alpha:]]\+[[:blank:]][[:digit:]]\+,[^,]\+$\)
akan cocok dengan bagian baris yang tersisa (bagian yang ingin kita tempatkan di awal).
Kemudian kita memiliki \2 \1
untuk menempatkan grup kedua terlebih dahulu, lalu spasi, lalu grup pertama.
File asli akan dicadangkan sebagai file.txt.bak
, jika Anda tidak ingin itu gunakan -i
bukannya -i.bak
.
**Meskipun Anda akan mendapatkan output yang diinginkan, menggunakan Regex/sed tidak akan menjadi solusi optimal dalam kasus ini.
EDIT: Jika Anda memiliki baris seperti [Internet disconnected] Friday, Mar 13,2015 15:48:34
, coba ini:
$ sed -i.bak 's_\(.*[^,]\),*[[:blank:]]\([[:alpha:]]\+,[[:blank:]][[:alpha:]]\+[[:blank:]][[:digit:]]\+,[^,]\+$\)_\2 \1_' file.txt
Friday, Mar 13,2015 15:48:34 [Internet disconnected]
Friday, Mar 13,2015 16:59:42 blah, blah, blah
Friday, Mar 13,2015 16:51:11 yadi, yadi, yada
Di regex sebelumnya kami memiliki \(.*\),[[:blank:]]
(koma dan spasi setelah grup pencocokan pertama), sekarang untuk memasukkan baris baru dalam output, kami telah membuat grup pencocokan pertama \(.*[^,]\)
untuk memastikan bahwa itu tidak diakhiri dengan koma dan kemudian kami telah mencocokkan ,*
yaitu satu koma atau lebih. Jadi, sed
. yang baru perintah akan bekerja untuk semua kasus yang disebutkan.