it-swarm.dev

Jak toužit po kartách bez použití doslovných karet a proč \ t nefunguje?

Když vyhledávám karty v souboru s (e) grep, použiju záložku litteral (^v + <tab>). Nemůžu využít \t jako náhrada za karty v regulárních výrazech. Například Sed tento výraz funguje velmi dobře.

Existuje tedy jakákoli možnost použít náhradní náhradu za <tab> a jaké jsou pozadí pro nepracující/neinterpretované \t?

159
Lasall

grep používá regulární výrazy definované POSIX . Z jakýchkoli důvodů POSIX nedefinoval \t jako karta.

Máte několik alternativ:

  • řekni grep, aby používal regulární výrazy definované Perlem (Perl má \t jako karta):

    grep -P "\t" foo.txt
    

    manová stránka varuje, že se jedná o „experimentální“ funkci. alespoň \t Zdá se, že funguje dobře. ale pokročilejší funkce jazyka Perl nemusí.

  • použijte printf k vytištění znaku karty pro vás:

    grep "$(printf '\t')" foo.txt
    
  • použijte znak doslovné karty:

    grep "^V<tab>" foo.txt
    

    to je: type grep ", poté stiskněte ctrl+v, poté stiskněte tab, poté zadejte " foo.txt. stiskem ctrl+v v terminálu způsobí doslovné převzetí dalšího klíče. to znamená, že terminál vloží znak tabulátoru místo spuštění některé funkce vázané na klávesu tab.

  • použijte funkci ansi c quoting bash:

    grep $'\t' foo.txt
    

    to nefunguje ve všech skořápkách.

  • použít awk:

    awk '/\t/'
    
  • použijte sed:

    sed -n '/\t/p'
    

Přehled definovaných tříd znaků v POSIX a dalších systémech najdete v článek wikipedia o regulárních výrazech .

224
lesmana

Není to přesně odpověď, kterou byste chtěli slyšet, ale možné použití únikových sekvencí poskytuje bash

command | grep $'\t'

(nedávejte to do uvozovek!).

14
enzotib

Jeden může vždy uchýlit se k použití ASCII hex-kód pro kartu:

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

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

$ grep $'\x9' input.txt                                            
one two
2

awk '/\t/' je moje oblíbené řešení:

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

Výstup: a\t.