Hazır bilgi sekmeleri kullanmadan sekmeler nasıl grep edilir ve neden çalışmaz?


146

(E) grep olan bir dosyadaki sekmeleri aradığımda litteral sekmesini ( ^v + <tab>) kullanıyorum. \tNormal ifadelerdeki sekmelerin yerine kullanamıyorum . Örneğin sed ile bu ifade çok iyi çalışıyor.

Öyleyse litteral olmayan bir değiştirme kullanmak için herhangi bir olasılık var mı <tab>ve çalışmayan / yorumlanmayan için arka plan \tnedir?


Yanıtlar:


206

grep, POSIX tarafından tanımlanan normal ifadeleri kullanıyor . Hangi sebeplerden dolayı POSIX \tsekme olarak tanımlanmadı .

Birkaç alternatifiniz var:

  • grep'e perl (perl \tsekmesi vardır) ile tanımlanan normal ifadeleri kullanmasını söyleyin :

    grep -P "\t" foo.txt

    man sayfası bunun “deneysel” bir özellik olduğu konusunda uyarıyor. en azından \tiyi çalışıyor gibi görünüyor. ancak 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
  • değişmez sekme karakterini kullanın:

    grep "^V<tab>" foo.txt

    yani: type grep ", ardından ctrl+vdüğmesine basın, tabsonra yazın, " foo.txt. ctrl+vterminale basılması bir sonraki anahtarın yazılı olarak alınmasına neden olur. bu, terminalin sekme tuşuna bağlı bazı işlevleri tetiklemek yerine sekme karakteri ekleyeceği anlamına gelir.

  • bash ansi c quoting ö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 sistemlerdeki tanımlanmış karakter sınıflarına genel bir bakış için normal ifadeler hakkındaki wikipedia makalesine bakın .


enzotib'in cevabına dayanarak şunu ekleyeyim: grep $'\t' foo.txt(ama genellikle fgrepyerine yazacağım grep)
Walter Tross

Buna, bir ortam değişkeninin değerini kullanarak birleştirdim. Ben kullanılan grep "$(printf '\t')${myvar}" foo.txt. İyi çalıştı. Birkaç denemeyle, çalışacak son formu alamadım.
sancho

1
Ovanın grepsessizce \tsekme olarak yorumlayamaması için herhangi bir sebep var mı ? POSIX bunun \tbaşka bir şey ifade etmesini gerektiriyor mu ? Belki de sadece \ onu izleyen bir edebi eşleşmesi gerekiyordu t?
Aaron McDaid,

Belki de BSD (OSX dahil) grep'in -P seçeneğinden yoksun olduğuna dikkat çekmeye değer.
TextGeek

Man sayfasından Eski sistemlerde This is highly experimental and grep -P may warn of unimplemented features.kullanmak iyi bir fikir olmayabilir -P. printfSeçim daha iyidir
Avindra Goolcharan

13

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 almayın!).


1
-E'ye gerek yoktur (aranan şey regex değildir). Ayrıca bir komuttan borulamaya gerek yoktur. Bununla birlikte, bash'ın bu göz ardı edilen özelliğini not ettiğiniz için teşekkür ederiz ($ tarafından verilen tek alıntı dizeler)
Walter Tross

2
Aslında, @enzotib'in cevabı basitçe değiştirmesini öneririm grep $'\t'.
Teemu Leisti

Bunun bir bash özelliği olduğu ve (başka bir kabuk tarafından Ubuntu ve diğerlerinde kabuk komut dosyaları için varsayılan olan çizgi gibi) (sessizce!) Yanlış bir şey yapacağı
vurgulanmalıdır


1

Kişi her zaman sekme için ascii hex kodunu kullanabilir:

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

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

$ grep $'\x9' input.txt                                            
one two
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.