Bagaimana cara mencampur pola dan rentang numerik dalam sed (atau alat serupa - awk misalnya)? Yang ingin saya lakukan adalah mencocokkan baris tertentu dalam file, dan menghapus baris n berikutnya sebelum melanjutkan, dan saya ingin melakukannya sebagai bagian dari pipeline.
105
+N
polanya adalah ekstensi GNU. Ubah yang pertaman
menjadi anN
dalam contoh kedua Anda untuk membuatnya menyertakan garis dengan pola./pattern/,+5
tentukan rentang, yang dimulai dengan baris yang berisi "pola" (/pattern/
) dan berakhir 5 baris kemudian (+5
). Karakter terakhird
adalah perintah untuk dijalankan pada setiap baris dalam rentang tersebut, yaitu "hapus". Dalam resep kedua, alih-alih mencocokkan rentang, itu cocok hanya pada baris yang berisi pola (/pattern/
) dan kemudian menjalankan serangkaian perintah:,{n;N;N;N;N;d}
yang pada dasarnya mencetak baris berikutnya (n
) dan kemudian membaca dan akhirnya membuang 4 baris berikutnya (N;N;N;N;d
).sed -e '/pattern/{n;N;N;N;N;d;}' file.txt
something
lakukan :, dised -E '/^something$/,$d'
mana-E
portabilitas diperpanjang regex POSIX.Tanpa ekstensi GNU (misalnya di macOS):
Untuk menghapus 5 baris setelah pola (termasuk baris dengan pola)
Tambahkan
-i ''
untuk mengedit di tempat.sumber
awk
Solusi 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 + 1
garis dilewati):Jika baris yang cocok tidak boleh dilewati (
$count
baris setelah pertandingan dilewati):Penjelasan:
-v regex="$regex" -v count="$count"
mendefinisikanawk
variabel 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,print
beforenext
memastikan 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 ini1
adalah singkatan yang umum digunakan untuk{ print }
; artinya, baris saat ini hanya dicetak1
setara dengan{ print }
adalah yang1
diartikan 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,awk
defaultnya adalah mencetak garis.sumber
Ini mungkin berhasil untuk Anda:
sumber
pattern_number.txt
adalah file 2 kolom yang berisi pola yang akan dicocokkan di kolom pertama, dan di kolom ke-2 jumlah baris yang harus dilewati.sed
Perintah pertama mengubah file menjadised
skrip yang melakukan pencocokan dan skipping yang sesuai; skrip itu disediakan melalui-f
dan stdin (-
) kesed
perintah ke-2 .sed
Perintah ke-2 beroperasi pada contoh file masukan ad-hoc yang dibentuk dari keluaranseq 21
untuk menunjukkan bahwa perintah tersebut berfungsi.Menggunakan Perl
sumber
Solusi ini memungkinkan Anda untuk meneruskan "n" sebagai parameter dan itu akan membaca pola Anda dari sebuah file:
File bernama "-" berarti stdin untuk awk, jadi ini cocok untuk pipeline Anda
sumber