Bagaimana saya bisa membaca sejumlah baris setelah menemukan beberapa teks?
Misalnya.:
Baca 2 baris berikutnya setelah menemukan "Unix" pada:
Test 1
Test 2
Test 3
Test 4
UNIX
Test 5
Test 6
Test 7
Test 8
Test 9
Hasilnya bisa:
Test 5
Test 6
Catatan: "Unix" pada contoh terakhir adalah argumen, dan karenanya, bisa berupa teks lain.
Apa yang saya punya:
Saya masih kehabisan ide, hanya perlu cahaya. Berpikir membuat skrip lain untuk melakukan itu.
$
tanda di awal jawaban saya adalah shell prompt, bukan bagian dariawk
perintah.awk '/^UNIX$/ {s=NR;next} s && NR<=s+2'
Sebuah
grep
solusi:Penjelasan:
-A
berarti: mencetak dua baris berikutnya setelah pertandinganAtau
awk:
Penjelasan: Pernyataan itu mencari UNIX di baris (
$0=="UNIX"
). Jika itu diberikan, ia akan mendapatkan buffer berikutnya (getline
) dan mencetak buffer (print
). Ini dilakukan dua kali.Atau gunakan
sed
:Penjelasan: Itu cocok untuk UNIX (
/^UNIX$/
). Jika ini ditemukan, ia menjalankan bagian dalam{...}
.n
berarti selanjutnya,p
berarti cetak. Ini dilakukan dua kali juga.sumber
getline; print;
bagian dalamawk
pernyataan ataun;p;
bagian dalamsed
pernyataan.grep -A100 -P '^UNIX$' file | tail -n +2
. Bagian ekornya untuk menghilangkan hak gadai pertama. Dalam yang lain (sed, awk) Anda harus menulis loop, apa yang membuatnya lebih sederhana.Halaman manual grep menjelaskan opsi sebagai berikut:
sumber
UNIX
dalam output juga.UNIX
, pipa ketail
:[...] | tail -n +1
, atau untuksed
:[...] | sed '1d'
.tail
dansed '1d'
hanya berfungsi dengan benar jikaUNIX
hanya muncul sekali dalam teks input. Semua jawaban lain memungkinkan untuk beberapa kejadian. Mungkin lebih baik menyarankan... | grep -v UNIX
. Harus diakui, ini menjadi berantakan jikaUNIX
muncul pada baris 15 dan 17.sed
dengan beberapa bentuksed '/UNIX/d;n;n;p/' /path/to/file
, yang saya hanya sussed dan kirimkan sebagai jawaban.Ini tampaknya berhasil dengan baik:
Bukti dari konsep:
sumber
for
loop Anda tidak perlu.Anda bisa menggunakan
ex
:dimana:
1,/UNIX/d
- menghapus teks setelah pertandingan%p
- mencetak bufferq!
- berhenti tanpa menyimpan perubahan ke file (gunakanwq
untuk mengedit di tempat)sumber