Saya mencoba untuk mencetak baris yang cocok dan baris ke-4 dari baris yang cocok (baris yang berisi ekspresi yang saya cari).
Saya telah menggunakan kode berikut:
sed -n 's/^[ \t]*//; /img class=\"devil_icon/,4p' input.txt
Tapi ini hanya mencetak garis yang cocok.
Ini hanya mencetak baris ke-4.
awk 'c&&!--c;/img class=\"devil_icon/{c=4}' input.txt
Saya perlu mencetak baris yang cocok dan baris ke-4 saja.
shell-script
debal
sumber
sumber
egrep "pattern" -A4
grep -A 4 "pattern" file | sed -n '4p'
memang melakukan apa yang Anda inginkan, kecuali saya salah paham dengan Anda</td>
yang bukan baris ke-4Jawaban:
Dalam awk, Anda akan melakukannya sebagai berikut
atau
Penjelasan
Solusi pertama menemukan semua baris yang cocok
pattern
. Ketika menemukan kecocokan, ia menyimpan nomor rekaman (NR
) dalam arraynr
. Ini juga menyimpan catatan ke-4 dariNR
dalam array yang sama. Ini dilakukan olehnr[NR+4]
. Setiap record (NR
) kemudian diperiksa untuk melihat apakah ada dalamnr
array, jika demikian record dicetak.Solusi kedua bekerja pada dasarnya dengan cara yang sama, kecuali ketika bertemu dengan
pattern
itu mencetak garis itu, dan kemudian menyimpan catatan ke-4 di depannya dalam arraynr
, kemudian pergi ke catatan berikutnya. Kemudian ketikaawk
menemukan catatan ke-4 ini,NR in nr
blok akan dieksekusi dan mencetak catatan +4 ini setelahnya.Contoh
Berikut ini contoh file data
sample.txt
,.Menggunakan solusi 1:
Menggunakan solusi ke-2:
sumber
awk
pintasan di sini, dapatkah Anda menambahkan penjelasan singkat (hal-hal seperti cetak tersirat dalam awk dan bahwa array asosiatif dll)?Saya hanya menambahkan penghapusan garis yang sesuai, sebelum dicetak
{ 3,5d ; p }
.sumber
sed: -e expression #1, char 18: unknown option to
s'`Anda dapat mencoba
-A
opsi dengangrep
, yang menentukan berapa banyak garis setelah garis yang cocok harus dicetak. Pasangkan ini dengansed
, dan Anda akan mendapatkan garis yang diperlukan.grep -A 4 pattern input.txt | sed -e '2,4d'
Dengan menggunakan
sed
, kami menghapus dari baris kedua hingga keempat.sumber
pattern
dalam file.Inilah cara di Perl yang dapat menangani jumlah baris yang cocok secara acak:
Dalam Perl. variabel khusus
$.
adalah nomor baris saat ini. Jadi, setiap kali saya menemukan garis yang cocokpattern
, saya mencetaknya dan menyimpan nomor barisnya sebagai$c
. Saya kemudian mencetak lagi ketika nomor baris saat ini adalah 4 lebih dari yang dicetak sebelumnya.sumber
Anda pada dasarnya mencari dan mengganti. Anda dapat menambahkan hanya menemukan ke dalam perintah yang sama dan itu akan mencetak keduanya :)
sumber