GNU/Linux >> Belajar Linux >  >> FreeBSD

Freebsd – Bsd Sed:Ganti Hanya Kemunculan Pola Yang Ke-N?

Menggunakan BSD sed;

Bagaimana saya bisa melakukan substitusi berikut?:

Sebelumnya:

hello hello hello
hello hello hello

Setelah:

hello world hello
hello hello hello

Dengan kata lain; bagaimana saya bisa mengganti hanya yang T yang kejadian dari suatu pola?
(Atau dalam hal ini; yang 2 dan kejadian dari suatu pola?)

Jawaban yang Diterima:

Dengan POSIX sed :

$ sed -e'/hello/{' -e:1 -e'$!N;s/hello/world/2;t2' -eb1 -e\} -e:2 -en\;b2 <file
hello world hello
hello hello hello
  • Setelah pertandingan pertama /hello/ , kita mengalami loop.

  • Lingkaran dalam :1 , kita membaca setiap N ext line ke ruang pola, lakukan s perintah pengganti untuk 2 nd kejadian saja. Kami t est jika substitusi berhasil atau tidak. Jika ya, kita mengalami loop :2 , jika tidak, ulangi loop dengan b1 .

  • Lingkaran dalam :2 , kami hanya mencetak baris yang tersisa sampai akhir file.

Perhatikan bahwa pendekatan ini akan menyimpan semua hal di antara dua halo dalam ruang pola. Ini akan menjadi masalah dengan file besar, ketika yang pertama dan yang kedua berjauhan.


FreeBSD
  1. Menggunakan Sed untuk Mencari &mengganti garis di antara rentang pola

  2. Bagaimana Cara Mengganti String Dalam File?

  3. Memasukkan File Ke File Lain Setelah Terjadinya Pola Pertama?

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

  2. Pertahankan Hanya Baris Pertama Dari Setiap Urutan Garis Berturut-turut yang Cocok dengan Pola?

  3. Temukan Hanya Kejadian Pertama Menggunakan Only Grep?

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

  2. Multi-Line Sed Ganti

  3. Menggunakan sed untuk mengganti antara pola tertentu