Anda dapat melakukan ini di GNU sed:
sed '0,/Matched Keyword/s//New Inserted Line\n&/'
Tapi itu tidak portabel. Karena portabilitasnya bagus, ini dia di awk:
awk '/Matched Keyword/ && !x {print "Text line to insert"; x=1} 1' inputFile
Atau, jika Anda ingin meneruskan variabel untuk dicetak:
awk -v "var=$var" '/Matched Keyword/ && !x {print var; x=1} 1' inputFile
Keduanya menyisipkan baris teks sebelum kemunculan pertama kata kunci, pada satu baris dengan sendirinya, sesuai contoh Anda.
Ingat bahwa dengan sed dan awk, kata kunci yang cocok adalah ekspresi reguler, bukan hanya kata kunci.
PEMBARUAN:
Karena pertanyaan ini juga diberi tag bash, inilah solusi sederhana yang murni bash dan tidak diperlukan sed:
#!/bin/bash
n=0
while read line; do
if [[ "$line" =~ 'Matched Keyword' && $n = 0 ]]; then
echo "New Inserted Line"
n=1
fi
echo "$line"
done
Seperti berdiri, ini sebagai pipa. Anda dapat dengan mudah membungkusnya dalam sesuatu yang berfungsi pada file.
Jika Anda menginginkannya dengan sed*:
sed '0,/Matched Keyword/s//Matched Keyword\nNew Inserted Line/' myfile.txt
*hanya bekerja dengan GNU sed
Ini mungkin cocok untuk Anda:
sed -i -e '/Matched Keyword/{i\New Inserted Line' -e ':a;n;ba}' file
Anda hampir sampai! Cukup buat loop untuk membaca dari Matched Keyword
ke akhir file.
Setelah menyisipkan baris, sisa file dapat dicetak dengan:
- Memperkenalkan tempat penampung loop
:a
(di sinia
adalah nama arbitrer). - Cetak baris saat ini dan ambil baris berikutnya ke dalam ruang pola dengan
n
perintah. - Arahkan kembali kontrol menggunakan
ba
perintah yang pada dasarnya adalahgoto
kea
pemegang tempat. Kondisi akhir file secara alami ditangani olehn
perintah yang menghentikan perintah sed lebih lanjut jika mencoba membaca melewati akhir file.
Dengan sedikit bantuan dari bash, one liner sejati dapat dicapai:
sed $'/Matched Keyword/{iNew Inserted Line\n:a;n;ba}' file
Alternatif:
sed 'x;/./{x;b};x;/Matched Keyword/h;//iNew Inserted Line' file
Ini menggunakan Matched Keyword
sebagai bendera di ruang tunggu dan setelah disetel, pemrosesan apa pun dibatasi dengan segera menebus.