GNU/Linux >> Belajar Linux >  >> Linux

Sed:Sisipkan Teks Setelah Karakter Ke-N Mendahului/mengikuti String yang Diberikan?

Menggunakan sed , bagaimana cara menyisipkan teks setelah karakter yang mendahului (atau mengikuti) beberapa string dengan N kejadian. Sebagai contoh, misalkan baris teks yang akan diedit adalah sebagai berikut:

command -some -args -c 'a quoted section;some;lines;of code;keyword;more lines;etc();'

Setelah menemukan baris ini dalam file teks (mungkin melalui string unik command ), saya ingin memasukkan teks setelah titik koma kedua (N=2) sebelum keyword (yaitu, titik koma yang memisahkan lines dan of ). Saya secara khusus ingin menggunakan sed untuk tujuan tersebut.

Melanjutkan contoh ini, output yang diharapkan adalah:

command -some -args -c 'a quoted section;some;lines;INSERTED_STRING;of code;keyword;more lines;etc();'

di mana INSERTED_STRING; (disediakan untuk sed, misalnya, melalui variabel shell) dimasukkan pada posisi yang diinginkan.

Jawaban yang Diterima:

Saya lebih suka yang sederhana:

sed '/command/s/[^;]*;keyword/INSERTED_STRING;&/'

untuk menyisipkan dua bidang sebelum kata kunci. Solusi umumnya adalah

sed "/command/s/\([^;]*;\)\{$N\}keyword/INSERTED_STRING;&/"

tetapi perhatikan bahwa N memiliki offnet 1 dibandingkan dengan pertanyaan Anda:Di sini, N=2 berarti memiliki dua bidang antara sisipan dan keyword .

Penjelasan:/command/ hanya memilih baris dengan command , sehingga jalur lain tetap tidak tersentuh. ([^;]*;\) cocok dengan satu bidang (urutan bukan titik koma) termasuk titik koma berikut. Dengan mengikutinya dengan \{$N\} polanya cocok dengan $N bidang. Berikut keyword menyelesaikan ini untuk mencocokkan keyword dan $N bidang sebelumnya. Pola pengganti terdiri dari string yang disisipkan dan & , yang diganti dengan semua yang cocok (jadi pada akhirnya, itu bukan pengganti, tetapi sisipan).

Singkat, dan lebih mudah dibaca dengan ekspresi reguler yang diperluas:

sed -E "/command/s/([^;]*;){$N}keyword/INSERTED_STRING;&/"

Linux
  1. Masukkan beberapa baris ke dalam file setelah pola yang ditentukan menggunakan skrip shell

  2. Temukan dan ganti teks dalam file di antara rentang baris menggunakan sed

  3. ganti kemunculan string ke-n di setiap baris file teks

  1. Bagaimana Cara Menggabungkan Semua Garis Yang Berakhir Dengan Karakter Backslash?

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

  3. Bagaimana cara mengatur kursor setelah karakter terakhir di vim?

  1. Bungkus Karakter Pertama Dari Sebuah String Menggunakan Sed?

  2. Gunakan Sed Untuk Menambahkan Karakter Di Posisi Ke-N Dari String Yang Cocok?

  3. Hapus Baris Yang Mengandung String Tertentu Dan Baris Berikut?