GNU/Linux >> Belajar Linux >  >> Linux

sed untuk memasukkan hanya pada pertandingan pertama

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:

  1. Memperkenalkan tempat penampung loop :a (di sini a adalah nama arbitrer).
  2. Cetak baris saat ini dan ambil baris berikutnya ke dalam ruang pola dengan n perintah.
  3. Arahkan kembali kontrol menggunakan ba perintah yang pada dasarnya adalah goto ke a pemegang tempat. Kondisi akhir file secara alami ditangani oleh n 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.


Linux
  1. Bagaimana Cara Menyisipkan Teks Sebelum Baris Pertama Sebuah File?

  2. Cetak Baris Sebelumnya Setelah Pencocokan Pola Menggunakan Sed?

  3. Bisakah Sed Mengganti Karakter Baris Baru?

  1. Tampilkan Semua File Hingga Pertandingan?

  2. Sed:Cetak Hanya Kejadian Pertama Dari Kecocokan Pola?

  3. Bagaimana cara menggunakan sed untuk menghapus hanya dua baris kosong?

  1. sed - menyisipkan baris setelah baris X setelah pertandingan

  2. Bagaimana cara memasukkan teks ke baris pertama file menggunakan sed?

  3. Bagaimana membedakan hanya baris pertama dari dua file?