Input.txt:
8B0C
remove
8B0D
remove
8B0E
remove
8B0F
8B10
remove
8B14
remove
8B15
remove
8B16
remove
8B17
remove
8AC0
8AC1
remove
8AC2
remove
8AC3
remove
8AE4
8AE5
8AE6
remove
Output yang diinginkan:
8B0F
8AC0
8AE4
8AE5
Saya ingin mencetak baris jika baris itu atau baris berikutnya tidak mengandung 'hapus'. Saya menggunakan solaris 5.10, KSH.
text-processing
sed
awk
solaris
ayrton_senna
sumber
sumber
Jawaban:
Dengan
sed
:Ini menarik
N
garis ext ke dalam ruang pola (jika tidak!
pada$
garis t) dan memeriksa apakah ruang pola cocokremove
. Jika tidak (berarti tidak ada satu pun dari dua garis dalam ruang pola yang berisi stringremove
), maka akanP
terputus ke\n
karakter ewline pertama (yaitu mencetak baris pertama). KemudianD
menghapus hingga\n
karakter baris pertama dan memulai ulang siklus. Dengan cara ini, tidak ada lebih dari dua garis dalam ruang pola.Itu mungkin lebih mudah untuk memahami
N
,P
,D
siklus jika Anda menambahkanl
sebelum dan setelahN
melihat ruang pola:jadi, gunakan hanya enam baris terakhir dari contoh Anda:
output perintah terakhir:
Berikut ini penjelasan singkatnya:
sumber
sumber
Metode di atas tidak membaca Records baris demi baris , melainkan membaca Catatan multi-line dari satu Pemisah Rekaman (RS) ke yang berikutnya (atau akhir file) -
RS
menjadi baris "hapus" itu sendiri (termasuk membuntuti `\ n).The
!RT
uji dibutuhkan ketika baris terakhir bukan merupakanRS
line.RT
, gawk-isme , adalah teks aktual dari catatan saat iniRS
.gensub
juga merupakan gawk-isme .Jika Anda perlu memeriksa garis penanda yang cocok dengan "hapus" di mana saja di dalam garis tersebut, vs garis yang sama dengan "hapus", maka cukup ganti Pemisah Catatan ke:
Keluaran:
sumber