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;&/"