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.