grep --before-context 5
menunjukkan 5 baris sebelum pertandingan.
Saya ingin menunjukkan segalanya sebelum pertandingan.
Melakukan grep --before-context 99999999
akan berhasil tetapi tidak terlalu ... profesional.
Bagaimana cara menampilkan semua file hingga sesuai?
text-processing
awk
sed
grep
Nicolas Raoul
sumber
sumber
sed '/PATTERN/Q' FILE
akan melewati garis yang cocok.Q
adalah ekstensi GNU, jadi itu tidak akan berfungsi dengan sed.sed
dapat menggantikan sebagian besar fungsi grep.Ini berarti mencetak dari baris pertama hingga pola cocok.
Beberapa contoh rentang
sumber
cetak hingga dan termasuk kecocokan:
cetak hingga TAPI TIDAK termasuk pertandingan:
sumber
Q
Keren tapi afnu khusus gnu,sed -n '/pattern/!p;//q'
akan lebih portabel.!
membuatp
berlaku untuk garis yang tidak cocokpattern
, tapi kemudian//q
membingungkan saya ...//
berarti "ekspresi reguler sebelumnya" (saya pikir itu berarti "cocok dengan string kosong"). Saya pikir versi yang lebih pendek dari solusi yang sama adalahsed -n '/pattern/q;p
:?grep
Metode GNU murni berikut tidak efisien.Cari semuanya hingga instance pertama dari string " foo " di bilah file , menggunakan tiga
grep
s:Mencocokkan hingga instance terakhir dari " foo ":
Catatan: perincian tentang yang terakhir
grep
dapat ditemukan di: Regex (grep) untuk pencarian multisaluran .sumber
grep
s (+ pcre) padahal hanya menjalankan satused
permintaan saja:sed 'x;/./G;//!x;/foo/p;//s/.*//;x;d'
??sed
kode Anda sepertinya layak dijawab sendiri, atau dapat ditambahkan ke yang lain. Re 7grep
s: Karena tidak adagrep
jawaban ... (ditambah, jawabannya membantu menunjukkan mengapa tidak.)Menambahkan ke jawaban Mikel di atas ...
Untuk mencetak semua baris hingga, tetapi tidak termasuk , baris pertama yang
FILE
berisiPATTERN
, coba:sed '/.*PATTERN.*/{s///;q;}' FILE
Ini cocok dengan seluruh baris yang berisi pola, menggantikannya dengan baris kosong, lalu berhenti tanpa memproses sisa file.
Nota bene:
Cara termudah / paling jelas yang bisa saya pikirkan untuk mencegah mencetak baris baru tambahan di akhir (tanpa melibatkan alat lain), adalah menjalankan sed lagi dan menghapus baris akhir baru:
... dan karena kita sekarang menghapus garis itu, pekerjaan kita sebelumnya berlebihan dan kita dapat menyederhanakan untuk:
sumber
sed
doa tunggal .tcsh
danbash
alias, saya perlu memastikan saya memiliki solusi satu-jalur yang relatif ringkas yang berfungsi baik dalam standar dan GNUsed
(untuk portabilitas); semua persyaratan yang mungkin telah dipenuhi oleh kontribusi Anda. Sebagai seseorang yang menggunakansed
sangat jarang, kebutuhan saya yang paling penting adalah untuk sesuatu yang saya bisa cepat memahami ketika saya ingin dengan mudah mengedit atau re-tujuan itu tahun dari sekarang.Untuk orang yang memilih untuk mengingat hanya alat dasar dalam pekerjaan sehari-hari, dan bersedia menerima solusi yang kurang elegan dan kurang efisien:
Jika perintah ini untuk skrip maka saya akan mencari solusi yang lebih elegan (dan mungkin efisien). Jika ini adalah perintah satu kali atau skrip dibuang maka saya tidak peduli.
sumber
Anda juga dapat menggunakan salah satu dari yang berikut ini
atau
atau
Opsi pertama sangat mirip dengan apa yang disarankan OP hanya itu memastikan ti menunjukkan cukup baris sebelum konteks dengan menghitung baris dalam file
Opsi kedua mencari nomor baris dari pertandingan pertama (Anda bisa mengubahnya juga dengan mengubah 'kepala' bagian dalam) dan daripada menggunakan kepala di nomor itu
Opsi terakhir menggantikan semua baris baru dengan pertandingan dan daripada mengganti dua pertandingan yang berdekatan dengan baris baru. Output dari ini adalah baris untuk setiap blok teks antara dua kecocokan. Setelah itu menggunakan 'head' untuk memilih baris pertama (mengubah blok teks hingga kecocokan pertama) cocok dan kemudian menerjemahkan ulang setiap kecocokan ke baris baru. opsi ini hanya berfungsi jika file dalam format berikut
Dan seterusnya
sumber
sed
perintah yang ada di bagian bawah adalah jenis degil.