Bunun için Grep ve bir dosyada değil?


0

Bu metin içeren bir dizin yapısındaki dosyaları nasıl grep edebilirim

addDesignControlChangeNotification

ama bu metni eksik

removeDesignControlChangeNotification

Teşekkürler!

Not: Yani betiğin başlayacağı dizin ve tüm alt dizinler.


Hmm, ana dizinde mi, yoksa ana dizinde ve alt dizinlerde?
Rich Homolka

Demek istediğim, betiği tüm alt dizinlerde başlattık. Üzgünüm, daha önce net değildi.
Dan Rosenstark

Yanıtlar:


1

İşte gevşek bir şekilde Rich Homolka'nınkilere dayanan. Cevap , ancak dizin ağaçlarında çalışır:

find . -type f  -exec grep -l addDesignControlChangeNotification {} \; | 
 while IFS= read -r file; do 
   grep -q removeDesignControlChangeNotification "$file" > /dev/null ; 
   [ $? -ne 0 ] && echo $file; 
 done

Dönen dosyalar içerecektir addDesignControlChangeNotification Ama değil removeDesignControlChangeNotification.

AÇIKLAMA:

  • find . -type f -exec grep -l foo {} \;: Bu, dizgeyi içeren mevcut dizinin herhangi bir alt dizinindeki tüm dosyaları basacaktır. foo. -l bayrak grep'in yalnızca eşleşen dosyaların adlarını yazdırmasına neden olur.

  • while read file : Bu, yukarıda bulunan her bir dosyayı tekrar eder ve ismini değişkene kaydeder. $file.

  • grep -q bar "$file" > /dev/null : bu komut dizeyi arar bar İçerdiği dosyaların her birinde foo.

  • [ $? -ne 0 ] && echo $file; : Eğer dönüş değeri ( $? ) grep komut 0'dı (yani, dizede dosyada değilse), dosyanın adını yazdırın.


Harika, kullanıyorum find . -name '*.m' -type f -exec grep -l addDesignControlChangeNotification {}... kendimden söz ettiğimden beri kendime eklediğim;) Teşekkürler!
Dan Rosenstark

2

bu çalışmalı:

FIRST=addDesignControlChangeNotification
SECOND=removeDesignControlChangeNotification
grep -l $FIRST * | while IFS= read -r FILE
do
    grep $SECOND "$FILE" &> /dev/null
    if [ $? -ne 0 ]
    then
        echo "File $FILE has $FIRST but not $SECOND"
    fi
done

Harika görünüyor, ancak gerçekten bu dizinlere girmek yerine "Bir dizin var" alıyorum. Yanlış olan ne varsa? Teşekkürler +1!
Dan Rosenstark

@Yar, ekleyebilirsiniz -r ilk grep Dizinleri tekrarlamak istiyorsanız komut. Veya cevabımı kullanabilirsiniz;).
terdon

0

Bir astar:

comm -2 -3 <(grep -rl addDesignControlChangeNotification     . | sort ) \
           <(grep -rl removeDesignControlChangeNotification  . | sort )

grep -r özyinelemeli bir grep, <() olduğu işlem değiştirme , ve comm size bir çift (sıralanmış) dosyanın ortak / sahip olmadığı hatları gösterir. Bu durumda sadece sütun 1 çıktısını istiyoruz: ikincisinde olmayan ilk dosyadaki satırlar (burada "dosya" gerçekten grep çıktı)

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.