grep satu baris sebelum pertandingan plus pertandingan

8
zzzzzzzzz
aaaaaaaaa
bbbbbbbbb &
ccccccccc &
ddddddddd
hhhhhhhhh
eeeeeeeee
fffffffff &
ggggggggg &

pada baris di atas, yang saya inginkan adalah grep/ sed/ awk(metode apa pun baik-baik saja) baris yang memiliki &tanda plus satu baris di atas mereka. jadi misalnya output yang diinginkan akan terlihat seperti:

aaaaaaaaa
bbbbbbbbb &
ccccccccc &
eeeeeeeee
fffffffff &
ggggggggg &

Berikut ini adalah apa yang saya coba tanpa hasil.

egrep "&" | -b 1 file.txt
Rana Khan
sumber

Jawaban:

16

Anda dapat melakukan:

grep -B 1 '&$' your_file

Ini akan mencari garis yang diakhiri &, menghapus $untuk mencocokkan garis dengan &mana saja di dalamnya.

The -Bberalih mengatakan grepoutput "konteks" garis yang datang sebelum baris yang cocok. Dalam hal ini, karena Anda menginginkan satu baris konteks, Anda perlu -B 1.

Switch ini tersedia di GNU greptetapi tidak dalam standar POSIX.

Inilah sedsolusi sederhana yang seharusnya membantu jika Anda tidak memiliki GNU grep:

sed -n '/&/!N;/&/p' your_file

Bagaimana itu bekerja

  • The -nberalih menekan default "cetak" aksised
  • /&/!Nberarti: jika baris saat ini tidak mengandung &, tambahkan baris berikutnya ke ruang pola.
  • /&/pberarti: cocokkan &dan cetak ruang pola.
Joseph R.
sumber
2
@RanaKhan Selamat datang di Stack Exchange :) Saya senang saya bisa membantu. Tolong jangan lupa untuk menandai jawaban ini sebagai diterima (gunakan tanda centang di bawah tombol pilih di sebelah jawaban) jika itu membantu menyelesaikan masalah Anda sehingga orang lain yang menjelajahi situs tahu bahwa masalah ini terpecahkan.
Joseph R.
+1 untuk varian saat GNU/greptidak tersedia, terima kasih!
ckujau
3

Berikut cara meniru grep -B1dengan sed:

sed '$!N;/pattern/P;D' infile

Ini sangat mirip dengan yang ada di sini . Sama seperti yang lain, ia membaca dalam Ngaris ext tetapi kali ini, ia Pmembentang ke \ngaris pertama jika ruang pola cocok , dan kemudian, seperti yang lain, Dmenghapus hingga \ngaris pertama dan memulai kembali siklus. Jadi dengan input sampel Anda:

sed '$!N;/&/P;D' infile

output:

aaaaaaaaa
bbbbbbbbb &
ccccccccc &
eeeeeeeee
fffffffff &
ggggggggg &

Sekali lagi, untuk melihat cara kerjanya, tambahkan lsebelum dan sesudah Nuntuk melihat ruang pola ::

sed 'l;$!N;l;/&/P;D' infile

misalnya dengan file sampel:

zzzz &
aaaa
bbbb
cccc &
dddd &
hhhh
eeee
ffff &
gggg &

ini adalah perintah yang sedmengeksekusi dan output yang sesuai:

cmd output cmd
l       zzzz &$               N # read in the next line
l       zzzz &\naaaa$         # pattern space matches so print up to \n
P       zzzz &                D # delete up to \n 
l       aaaa$                 N # read in the next line
l       aaaa\nbbbb$           D # delete up to \n (no match so no P)
l       bbbb$                 N # read in the next line
l       bbbb\ncccc &$         # pattern space matches so print up to \n
P       bbbb                  D # delete up to \n
l       cccc &$               N # read in the next line
l       cccc &\ndddd &$       # pattern space matches so print up to \n
P       cccc &                D # delete up to \n
l       dddd &$               N # read in the next line
l       dddd &\nhhhh$         # pattern space matches so print up to \n
P       dddd &                D # delete up to \n
l       hhhh$                 N # read in the next line
l       hhhh\neeee$           D # delete up to \n (no match so no P)
l       eeee$                 N # read in the next line
l       eeee\nffff &$         # pattern space matches so print up to \n
P       eeee                  D # delete up to \n
l       ffff &$               N # read in the next line
l       ffff &\ngggg &$       # pattern space matches so print up to \n
P       ffff &                D # delete up to \n
l       gggg &$               # last line so no N 
l       gggg &$               # pattern space matches so print up to \n
P       gggg &                D # delete up to \n
don_crissti
sumber