Bagaimana saya bisa mendapatkan direktori untuk baris yang berisi "Foo", tetapi hanya mendapatkan kecocokan ketika baris berikutnya juga berisi "Bar"?
grep
regular-expression
Nathan Long
sumber
sumber
Jawaban:
@ warl0ck menunjuk saya ke arah yang benar dengan
pcregrep
, tetapi saya berkata "berisi", bukan "adalah", dan saya bertanya tentang direktori, bukan file.Ini sepertinya bekerja untuk saya.
sumber
Grep sendiri sepertinya tidak mendukungnya, gunakan pcregrep sebagai gantinya:
pcregrep -M "Foo\nBar" file
Punya:
sumber
Foo
danBar
akan terdiri dari seluruh lini.Dengan
sed
skrip:Untuk menggunakannya:
Di
printf
sini menampilkan semua file dalam direktori saat ini pada setiap baris, dan meneruskannya kesed
.Catatan : ini disortir berdasarkan urutan abjad.
Info lebih berguna
pattern space
danhold space
DI SINI .grymoire.com memiliki hal-hal yang sangat baik tentang
shell
pemrograman.sumber
h, n, H, x, p, q
artinya? Sangat menarik.pattern space
&hold space
: grymoire.com/Unix/Sed.html#uh-56 atau dalam bahasa Perancis commentcamarche.net/faq/9536-sed-introduction-a-sed-part-iHanya menggunakan
grep
, Anda bisa membuat pipa berikut:grep -A1 'Foo' input_file | grep -B1 'Bar' | grep 'Foo'
Yang pertama
grep
akan mendapatkan semua baris yang berisiFoo
serta baris setelah pertandingan. Lalu kami mendapatkan garis yang berisiBar
serta garis sebelum pertandingan, dan akhirnya mengekstrak garis dari output yang berisi iniFoo
.EDIT: Seperti yang ditunjukkan oleh manatwork , ada beberapa kasus bermasalah yang harus diperhatikan. Meskipun tantangan yang menarik, karena
grep
fungsionalitas yang berorientasi pada garis, solusi apa pun yang ada kemungkinan adalah 'retas' dan Anda mungkin lebih baik menggunakan sesuatu sepertipcregrep
yang lebih cocok untuk tugas yang sedang dihadapi.sumber
find . -name '*.txt' | xargs grep -A1 'Foo' | grep -B1 'Bar'
Sementara saya lebih suka menggunakan solusi Nathan
pcregrep
, berikut adalah solusi hanya menggunakan grepPenjelasan opsi:
-o
hanya mencetak bagian yang cocok. Diperlukan sejak dimasukkannya-z
akan mencetak seluruh file (kecuali ada \ 0 di suatu tempat)-z
Perlakukan input sebagai satu set garis, masing-masing diakhiri dengan byte nol (karakter ASCII NUL) alih-alih baris baru.-P
sintaks perl regexEDIT: Versi ini mencetak seluruh baris yang cocok
sumber
-z
. Beberapa "(. *)" Sebelum dan sesudah seluruh ekspresi akan membuatnya menampilkan seluruh baris yang cocok. Untuk saat ini substring sebelum "Foo" dan setelah "Bar" tidak ditampilkan.Dengan awk:
(catatan umum tentang batasan awk: berhati-hatilah bahwa jika beberapa nama file mungkin berisi "=" karakter, Anda harus meneruskannya sebagai
./filename
gantifilename
awk)sumber