Saya ingin mencetak baris sebelumnya, setiap kali ditemukan kecocokan. Saya tahu tentang grep -A
dan -B
pilihan. Tetapi mesin Solaris 5.10 saya tidak mendukung opsi tersebut.
Saya ingin solusi hanya menggunakan sed
.
Foo.txt
:
Name is : sara
age is : 10
Name is : john
age is : 20
Name is : Ron
age is : 10
Name is : peggy
age is : 30
Out.txt
:
Name is : sara
Name is : Ron
Pola yang saya coba cocokkan adalah age is : 10
.
Lingkungan saya, Solaris 5.10.
Jawaban yang Diterima:
$ sed -n '/age is : 10/{x;p;d;}; x' Foo.txt
Name is : sara
Name is : Ron
Di atas diuji pada GNU sed. Jika sed Solaris tidak mendukung perintah rantai bersama dengan titik koma, coba:
$ sed -n -e '/age is : 10/{x;p;d;}' -e x Foo.txt
Name is : sara
Name is : Ron
Cara kerjanya
sed memiliki ruang penahanan dan ruang pola. Baris baru dibaca ke dalam ruang pola. Ide dari skrip ini adalah bahwa baris sebelumnya disimpan di ruang tunggu.
-
/age is : 10/{x;p;d;}
Jika baris saat ini berisi
age is : 10
, lalu lakukan:x
:tukar pola dan tahan spasi sehingga baris sebelumnya berada di ruang polap
:cetak baris sebelumnyad
:hapus ruang pola dan mulai memproses baris berikutnya -
x
Ini dijalankan hanya pada baris yang tidak mengandung
age is : 10
. Dalam hal ini, ini menyimpan baris saat ini di ruang tunggu.
Melakukan sebaliknya
Misalkan kita ingin mencetak nama orang yang usianya bukan 10:
$ sed -n -e '/age is : 10/{x;d}' -e '/age is :/{x;p;d;}' -e x Foo.txt
Name is : john
Name is : peggy
Di atas menambahkan perintah ke awal, /age is : 10/{x;d}
, untuk mengabaikan usia 10 orang. Perintah berikut, /age is :/{x;p;d;}
, sekarang menerima semua usia yang tersisa.