2016-04-12 38 views
0

Belirli bir kalıbı içermeyen tüm satırlardan bir dosyadan çıkarmak istiyorum.Bash - Belirli bir desen içermeyen bir dosyadan satırların alınması

pattern="tmp/[...]/include/linux/*.h" 
file contains: 
17937;/home/[...]/tmp/[...]/include/linux/header.h;484;16;[Other text here] 
37417;/home/[...]/tmp/[...]/src/file.cpp;1851;41;[Other text here] 
17945;/home/[...]/tmp/[...]/include/linux/*/header.h;484;16;[Other text here] 

Beklenen sonuç yalnızca ikinci satırdır.

Ben feryat çizgi denedim ve dosyanın tüm içeriği olsun:

grep -E -v $pattern file 

Sadece feryat hattı ile çalışır, fakat yeterli değildir:

grep -E -v .h file 

nasıl İstenen çıktıyı alabilir miyim?

+2

grep -E -v "tmp /\\[...\\]/ include/linux /.* \. H" verilerinizi temel alarak istenen sonucu alır. – sigmalha

+0

Satırları belirleyen şablonun dışlanması düzeltilmişse ya da joker karakter kullanmak gibidir: * .h -> .h uzantılı tüm dosyaları hariç tutar. – MarcM

+0

Joker karakter kullanmak gibidir. Bu şablonun hariç tutulması gereken tüm satırlar (aynı konumdaki tüm .h satırları) –

cevap

1

Sizin düzenli ifade [] yollarla "maç ise bu karakterlerin" arasındaki karakterler içeren bir liste çünkü

  • ilk köşeli ayraç "tmp/\[\.\.\.]/include/linux/.*\.h", kaçan gerekir haline gelmesi gerekmektedir.
  • Joker karakter, ondan önceki karakterle ilişkilendirilir, bu nedenle herhangi bir karakterle eşleşmesi için önce bir nokta koymanız gerekir.
  • Ve bunlarla eşleştirmek istiyorsanız noktalardan kaçmanız gerekir, aksi takdirde herhangi bir karakterle eşleşir (sizin durumunuzda çalışacaktır).
+1

İlk köşeli ayraçtan kaçmak da önemlidir. POSIX reg ex man sayfasındaki 'bracket ifadesi 'bölümüne bakın:' man re_format'. –

+0

Doğru, bunu da vurgulamayı unuttum, teşekkürler. – Sylvain