Grep çok çizgili desen


13

Bir ifadeyi birden çok satırda nasıl arayabilirim? Örneğin, "buzlu çayım" ifadesine sahip olalım, o zaman metin dosyalarına sarılabilir:

as js skdfh dfh djh sf my
ice tea.

Arada yeni satır olduğu için grep eşleşmeyecek. Bunları nasıl eşleştirebilirim? Başka bir çok satırlı desenpattern1_\n_pattern2

ATM'yi yapmanın en kolay yolunun sadece bir kısmı için grep olduğunu biliyorum, örneğin -A2 -B2 bayrağıyla buz ve daha sonra örneğin çay için againg. Ama bu çok sıkıcı. Bu yüzden bunu nasıl çözeceğine dair bir fikrim var.


Yanıtlar:


16

"Perl Uyumlu Düzenli İfadeler" pcregrepkullanan pcre kitaplığını kullanarak grep olan (çoğu dağıtım deposunda kullanılabilir) yükleyebilirsiniz . Man sayfasından-M çok satırlı arama yapmanızı sağlayan bir komut satırı seçeneğine sahiptir :

"Herhangi bir eşleşmenin çıktısı birden fazla satırdan oluşabilir."

Böylece yapabilirsin

pcregrep -M 'my\s+ice\s+tea' filename

\sMaç olacak boşluk vardır \nve \rnormal bir boşluk karakterlerine ek olarak, satırlı modda. Ayrıca, yeni satır karakterini doğrudan eşleştirebilirsiniz.

pcregrep -M 'pattern1_\n_pattern2' filename

+1 güzel. hiç duymadım, ama denedim ve bir cazibe gibi çalışıyor!
DaveParillo

grep -EPCre kalıpları yapmıyor mu ?
Daenyth

3
@Daenyth grep -E çoğunlukla sadece kullanabileceğiniz anlamına gelir ?, +, {, |, (, ve )bir olması gerek kalmadan her zamanki regex anlam olarak \ standart grep kullanırsanız sizin gibi, önünde. Yani buna grep 'hello\s\+world' fileeşdeğerdir grep -E 'hello\s+world' file. PCRE yapmaz. Orada grep -P... perl normal ifadeler için, ancak deneysel (Adam sayfasına göre) ve bunu pcregrep biraz farklı olduğunu düşünüyorum
Hamish Downer

1
Evet, düşünüyordum -Pdedim zaman -E, ama farklı olduğunu fark etmedi.
Daenyth

3

Muhtemelen vim's :vimgrepkomutunu kullanarak bir arama yapmak . Bu, belirsiz bir şekilde çalışır, grepancak vim RE'leri ve yollarını destekler.

Temel olarak :vimgrep 'pattern1\npattern2' path/**, özyinelemeli arama gibi bir şey çalıştırırsınız , ardından :copeneşleşme listesini içeren daha küçük bir pencere açmak için yazın .

vimRE'ler çoğunlukla PCRE'lerin yapabildiği her şeyi yapabilir, ancak perl düzenli ifade neslinden ayrı olarak geliştiğinden, gelişmiş şeylerin çoğu farklı çalışır. Temel işlevleri daha çok temel RE'lerinkine benzer, ancak PCRE'lerin sunmadığı bazı şık eklemeler var.

:vimgrepVerileri olduğu gibi tükürmek mümkün olup olmadığından emin değilim grep; Ben sadece içinde gezinme için kullanmaya çalıştım vim.

:help vimgrepvimdaha fazla bilgi için içeriden ; RE'ler :help pattern.txthakkında bilgi için vim; yollar hakkında daha fazla bilgi için bkz :help wildcards.


Dikkatli olun - farklı platformlarda farklı davranacağı için tamamen taşınabilir değil
Daenyth

1
@Daenyth: Farklı .vimrc'ların etkisi altında mı demek istediniz ? grepİşletim sistemine göre daha taşınabilir olmalıdır : vim"POSIX aroması" yoktur ve Windows altında bile az çok aynı şekilde çalışır. .................................................. ........................... Örneğin RE'de doğru miktarda "büyü" kullanılmasını sağlamak için niteleyiciler eklemek mümkündür. anladığım kadarıyla, bu seçeneği heck'i yalnız bırakmak için katı ve yazılı olmayan bir kural var.
2010'da

Kendim kullanmadım, ama görünüşe göre ( find.exeyerine grep) pencerelerde farklı bir arka uç kullanıyor . Son birkaç hafta içinde bu konuyla ilgili başka bir soru vardı.
Daenyth

1
@Daenyth: :vimgrepveya düşünüyorsun :grep? Gönderen :help grep: "Dahili grep [avantajı :vimgrep] avantajı , tüm sistemlerde çalışıyor ve güçlü Vim arama kalıplarını kullanıyor olmasıdır."
2010'da

1
Ah, bu olmalı. İkisini karıştırdım.
Daenyth

2

Grep her seferinde yalnızca bir satırda çalışır, ancak bir dizi desenle eşleşen satırları yazdırmak için awk kullanabilirsiniz:

cat file | awk '/foo/,/bar/'

sadece iki model arasındaki yeni satırlarla değil, her şeyle eşleşir


0

Unix'ten en iyi şekilde yararlanmak için borulardan yararlanmanız gerekir. Bunu grepboruları kullanarak düz olarak yapabilirsiniz (tee'ye gerek yoktur):

$ grep -A1 "pattern1" file.txt |  grep "pattern2"

Hangi sıkıcı düşünün olmaz.


Desen1 ve desen2 arasında aradığınız şey olmayabilir desen3 var gibi bu hata eğilimli olduğunu düşünüyorum. Bu yüzden her isabeti manuel olarak kontrol etmelisiniz.
matematik
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.