Bunun için grep kullanmaya çalışmayın, bunun yerine awk kullanın. Grep'te 2 regexps R1 ve R2'yi eşleştirmek için bunun olacağını düşünürdünüz:
grep 'R1.*R2|R2.*R1'
awk içinde iken:
awk '/R1/ && /R2/'
Peki R2
ya bir alt kümesiyle çakışıyorsa ya da bir alt kümesi ise R1
? Bu grep komutu, awk komutu çalışırken işe yaramaz. Eğer içeren satırları bulmak istiyorsunuz diyelim the
ve heat
:
$ echo 'theatre' | grep 'the.*heat|heat.*the'
$ echo 'theatre' | awk '/the/ && /heat/'
theatre
Bunun için 2 vites ve bir boru kullanmanız gerekir:
$ echo 'theatre' | grep 'the' | grep 'heat'
theatre
ve tabii ki aslında ayrı olmalarını istediyseniz, her zaman grep'te kullandığınızla aynı regexp'i yazabilirsiniz ve regexps'leri her olası sırayla tekrarlamayı içermeyen alternatif awk çözümleri vardır.
Bunu bir kenara bırakırsak, çözümünüzü 3 regexps R1, R2 ve R3'e uyacak şekilde genişletmek isterseniz ne olur? Grep'te bu kötü seçimlerden biri olurdu:
grep 'R1.*R2.*R3|R1.*R3.*R2|R2.*R1.*R3|R2.*R3.*R1|R3.*R1.*R2|R3.*R2.*R1' file
grep R1 file | grep R2 | grep R3
awk iken kısa, açık, basit, verimli olurdu:
awk '/R1/ && /R2/ && /R3/'
Şimdi, gerçekte R1 ve R2 normal ifadeleri yerine S1 ve S2 değişmez dizelerini eşleştirmek isteseydiniz? Bunu grep'e yapılan bir çağrıda yapamazsınız, grep'i çağırmadan önce tüm RE metachar'lardan kaçmak için kod yazmanız gerekir:
S1=$(sed 's/[^^]/[&]/g; s/\^/\\^/g' <<< 'R1')
S2=$(sed 's/[^^]/[&]/g; s/\^/\\^/g' <<< 'R2')
grep 'S1.*S2|S2.*S1'
veya tekrar 2 greps ve bir boru kullanın:
grep -F 'S1' file | grep -F 'S2'
awk ile regexp operatörü yerine bir dize operatörü kullanırsanız:
awk 'index($0,S1) && index($0.S2)'
Şimdi, bir paragraf yerine bir satırda 2 normal ifadeyi eşleştirmek isteseydiniz? Grep'te yapılamaz, awk'de önemsizdir:
awk -v RS='' '/R1/ && /R2/'
Tüm bir dosyaya ne dersiniz? Yine grep'te yapılamaz ve awk'ta önemsizdir (bu sefer kısaltma için çoklu char RS için GNU awk kullanıyorum ama herhangi bir awk'da çok daha fazla kod yok veya bilmediğiniz bir kontrol-char seçebilirsiniz RS'nin aynısını yapması için girdi olması):
awk -v RS='^$' '/R1/ && /R2/'
Yani - bir satırda veya paragrafta veya dosyada birden fazla regexps veya dize bulmak istiyorsanız grep kullanmayın, awk kullanın.