mantık operatörleri ile grep


19

Mantık operatörleri ile grep aramaları yapmamı sağlayacak grep benzeri bir yardımcı program var mı? Mantıksal yapıları özgürce iç içe yerleştirip birleştirebilmek istiyorum. Örneğin, bunun gibi şeyler mümkün olmalıdır:

grep (term1 && term2) || (term1 && (term3 xor term4)) *

Bunun vanilya grep ve ek bash komut dosyası oluşturma ile yapılabileceğinin farkındayım, ancak buradaki amacım bunu yapmaktan kaçınmak.

grep 

Yanıtlar:


12

İle awkolduğu gibi perl, terimleri içeriye sarmanız gerekir //, ancak yapılabilir:

awk '(/term1/ && /term2/) || (/term1/ && xor(/term3/, /term4/))' 

28

grepMantıksal işleçlerle kullanmanın birçok yolu vardır .

  1. OR koşulu \|için birden çok deseni ayırmak için kullanın .

    Misal: grep 'pattern1\|pattern2' filename

  2. VEYA koşulu -Eiçin birden çok desen gönderme seçeneğini kullanın .

    Misal: grep -E 'pattern1|pattern2' filename

  3. Tekli kullanmak -eyalnızca bir kalıpla eşleşir, ancak birden çok -eseçenek kullanılması birden fazla kalıpla eşleşir.

    Misal: grep -e pattern1 -e pattern2 filename

  4. grep -vNOT işlemini simüle edebilir .

  5. İçinde AND operatörü yoktur grep, ancak seçeneği kullanarak VEYA kaba kuvvet simüle edebilirsiniz -E.

    Misal : grep -E 'pattern1.*pattern2|pattern2.*pattern1' filename

    Yukarıdaki örnekte, her ikisi de içeren tüm satırları eşleşir Pattern1 ve pattern2 önce ya da sonra).


1
-E&&siparişe duyarlı olması nedeniyle tam olarak eşdeğer değildir
iruvar

grep foo | grep barVE yapmanın daha genel bir yoludur.
Kenster

2
+1, gerçek bir "AND" operatörü olmadığını ve yapabileceğimiz en iyi şeyin bir OR yapısı kullanarak bir korsanlığı simüle etmek olduğunu açıkça açıklamak için. Bu elbette 3'ten fazla terim ile uygunsuz olacaktır, ancak iki terim için iyi çalışır.
Eric Hepperle - CodeSlayer2010

grep -c -e MATCH1 -e MATCH2 dosya adı sayılarıyla ilgileniyorsanız harikadır.
andrej

4

Perl kullanabilirsiniz:

perl -wne 'print if (/term1/ && /term2/) || (/term1/ && (/term3/ xor /term4/))'

0
sed '/term1/!d;/term2/b' -e '/term3/!d;/term4/d' *

Bunun yapmaya çalıştığın şeyi başardığına inanıyorum. Bu dçıkış eşleşmeyen tüm çizgi dan eletes term1bu bsenaryonun dışarı çiftliklerde (ve autoprints böylece) herhangi bir satıra o kalıntılar ve bu maçlar term2ve eşleşmeyen hangi herhangi siler kalır hatları için term3ve maçı yapmak gelenlerde dan term4.

sed komut dosyaları sırayla değerlendirilir ve tüm testler boole'dir, bu nedenle testten kaynaklanan tüm eylemler aşağıdaki eylemlerin davranışlarını doğrudan etkileyecektir.


0

grepMantıksal bir VE elde etmek için komutları zincirlemek için kullanın:

grep expr1 filename | grep expr2

Oldukça basit, Unix benzeri ve zarif olduğuna inanıyorum.


Sonra (@Tushi iyice açıklandığı gibi) -EOR-ing ve -vreddetme seçeneği ile birleştirebilirsiniz .

Özel örneğiniz oldukça kötü ve muhtemelen daha güçlü bir yardımcı programdan faydalanacaktır (@ muru'nun cevabına bakınız).

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.