awkSolusi sederhana :
Asumsikan bahwa ekspresi reguler yang digunakan untuk menemukan garis yang cocok disimpan dalam variabel shell $regex, dan jumlah baris yang dilewati $count.
Jika garis yang cocok juga harus dilewati ( $count + 1garis dilewati):
... | awk -v regex="$regex" -v count="$count" \
'$0 ~ regex { skip=count; next } --skip >= 0 { next } 1'
Jika baris yang cocok tidak boleh dilewati ( $countbaris setelah pertandingan dilewati):
... | awk -v regex="$regex" -v count="$count" \
'$0 ~ regex { skip=count; print; next } --skip >= 0 { next } 1'
Penjelasan:
-v regex="$regex" -v count="$count"mendefinisikan awkvariabel berdasarkan variabel shell dengan nama yang sama.
$0 ~ regex cocok dengan garis minat
{ skip=count; next }menginisialisasi penghitungan lompatan dan melanjutkan ke baris berikutnya, secara efektif melompati baris yang cocok; dalam solusi kedua, printbefore nextmemastikan bahwa itu tidak dilewati.
--skip >= 0 mengurangi jumlah lompatan dan mengambil tindakan jika (masih)> = 0, menyiratkan bahwa garis yang ada harus dilewati.
{ next } melanjutkan ke baris berikutnya, secara efektif melewati baris saat ini
1adalah singkatan yang umum digunakan untuk { print }; artinya, baris saat ini hanya dicetak
- Hanya baris yang tidak cocok dan tidak dilewati yang mencapai perintah ini.
- Alasan yang
1setara dengan { print }adalah yang 1diartikan sebagai pola Boolean yang menurut definisi selalu bernilai true, yang berarti bahwa tindakan (blok) yang terkait dieksekusi tanpa syarat. Karena tidak ada tindakan terkait dalam kasus ini, awkdefaultnya adalah mencetak garis.
+Npolanya adalah ekstensi GNU. Ubah yang pertamanmenjadi anNdalam contoh kedua Anda untuk membuatnya menyertakan garis dengan pola.