Basit sekmeler kullanmadan sekmeler için grep nasıl yapılır ve neden çalışmıyor?

116

(e) grep ile bir dosyadaki sekmeleri aradığımda, litteral sekmesini kullanıyorum ( ^v + <tab> ). Düzenli ifadelerdeki sekmeler için \t değerini kullanamıyorum. Ör. Bu ifadeyi baştan çıkarmak çok iyi çalışıyor.

Peki, <tab> için litteral olmayan bir değiştirme kullanma olasılığı var mı ve çalışmayan / yorumlanmayan \t için arka planların neler olduğu var mı?

    
sordu Lasall 14.07.2011 13:59

4 cevap

163

grep POSIX tarafından tanımlanan normal ifadeleri kullanıyor. Hangi sebeplerden dolayı POSIX \t değerini tab olarak tanımlamamıştır.

Birkaç alternatifiniz var:

  • grep’e perl tarafından tanımlanan normal ifadeleri kullanmasını söyleyin (perl’de \t sekme var):

    grep -P "\t" foo.txt
    

    man sayfası, bunun "deneysel" bir özellik olduğu konusunda uyarıyor. en az \t iyi çalışıyor. ama daha gelişmiş perl regex özellikleri olmayabilir.

  • sizin için bir sekme karakteri yazdırmak için printf kullanın:

    grep "$(printf '\t')" foo.txt
    
  • basit sekme karakterini kullanın:

    grep "^V<tab>" foo.txt
    

    bu: grep " yazın, sonra ctrl+v tuşuna basın, sonra tab tuşuna basıp " foo.txt yazın. Terminaldeki ctrl+v 'ye basılması, bir sonraki tuşun gerçeklenmesini sağlar. Bu, terminalin sekme tuşuna bağlı bir işlevi tetiklemek yerine bir sekme karakteri ekleyeceği anlamına gelir.

  • bash’ın alıntılama özelliğini kullanın:

    grep $'\t' foo.txt
    

    Bu, tüm kabuklarda çalışmaz.

  • awk kullan:

    awk '/\t/'
    
  • sed kullanın:

    sed -n '/\t/p'
    

POSIX ve diğer sistemlerde tanımlı karakter sınıflarına genel bakış için normal ifadelerle ilgili makale makalesine bakın.

    
verilen cevap lesmana 14.07.2011 17:04
12

Tam olarak duymak isteyeceğiniz cevap değildir, ancak kaçış dizilerinin olası kullanımı bash

tarafından sağlanır.
command | grep $'\t'

(çift tırnak içine koymayın!).

    
verilen cevap enzotib 14.07.2011 16:15
2

awk '/\t/' favori çözümümdür:

printf 'a\t\nb' | awk '/\t/'

Çıkış: a\t .

    
1

Sekme için her zaman ascii hex kodunu kullanmaya başvurulabilir:

$ echo "one"$'\t'"two" > input.txt                                 

$ grep -P "\x9" input.txt                                          
one two

$ grep $'\x9' input.txt                                            
one two
    
verilen cevap Sergiy Kolodyazhnyy 03.07.2017 19:04

Etiketlerdeki diğer soruları oku