GNU/Linux >> Belajar Linux >  >> Linux

Cetak Baris Sebelumnya Setelah Pencocokan Pola Menggunakan Sed?

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 pola

    p :cetak baris sebelumnya

    d :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.


Linux
  1. Temukan Nomor Baris Yang Berisi Pola Menggunakan Pembatas Regex Khusus?

  2. Sed:Cetak Hanya Kejadian Pertama Dari Kecocokan Pola?

  3. Simpan File Setelah Menggunakan Perintah Sed?

  1. Hapus spasi putih di setiap awal baris file, menggunakan bash

  2. Cetak baris sebelumnya jika kondisi terpenuhi

  3. sed - menyisipkan baris setelah baris X setelah pertandingan

  1. Menggunakan Sed untuk Mencari &mengganti garis di antara rentang pola

  2. Bash - Cara mencetak string multi baris (dengan '\n') menggunakan printf

  3. Bagaimana cara memasukkan teks ke baris pertama file menggunakan sed?