GNU/Linux >> Belajar Linux >  >> Ubuntu

Pindahkan Pola Ke Awal Garis?

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 hingga blah, 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.

Terkait:Sudo habis waktu selama skrip berjalan lama?
Ubuntu
  1. Cetak Baris Sebelumnya Setelah Pencocokan Pola Menggunakan Sed?

  2. Bagaimana Cara Memindahkan Garis Dalam File Teks Ke Atas Atau Ke Bawah Dengan Satu Baris?

  3. Temukan Pola Dan Pindahkan?

  1. Mengganti Pola Setelah Kecocokan Ke-N Ditemukan Di Setiap Baris??

  2. Kembalikan Hanya Bagian Dari Garis Setelah Pola Yang Cocok?

  3. Menemukan Tidak Rekursif Ketika Diberikan Pola Pada Baris Perintah?

  1. Konsep 'Hold space' dan 'Pattern space' di sed

  2. Bagaimana saya bisa menambahkan string ke awal setiap baris dalam sebuah file?

  3. Ampersand di awal baris di csh