Jak rozbalit záložky bez použití doslovných karet a proč nefunguje?

118

Když vyhledávám karty v souboru s (e) grep, používám literální záložku (^v + <tab>). Nelze použít\t jako náhradu za karty v regulárních výrazech. S např. tento výraz funguje velmi dobře.

Takže existuje nějaká možnost použít nehratelnou náhradu za<tab> a jaké jsou pozadí pro nepracující / nereprodukovaný\t?

    
dané Lasall 14.07.2011 13:59

4 odpovědi

165

grep používá regulární výrazy definované v POSIXu . Z jakýchkoliv důvodů POSIX definoval\t jako kartu.

Máte několik alternativ:

  • Řekněte grep, že používá regulární výrazy definované perl (perl má\t jako záložka):

    grep -P "\t" foo.txt
    

    Manuální stránka varuje, že je to "experimentální" funkce. alespoň\t vypadá, že funguje dobře. ale pokročilejší vlastnosti perl regex nemusí.

  • Použijte printf pro vytisknutí znaku tabulátoru:

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

    grep "^V<tab>" foo.txt
    

    to je: typgrep ", pak stisknětectrl+v, pak stisknětetab, pak zadejte" foo.txt. stlačeníctrl+v v terminálu způsobí doslova další klíč. znamená to, že terminál vloží znak tabulátoru namísto spuštění nějaké funkce vázané na klíčenku tabulátoru.

  • použijte funkci citace v bash:

    grep $'\t' foo.txt
    

    to nefunguje ve všech shellů.

  • použijte awk:

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

    sed -n '/\t/p'
    

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

    
odpověděl lesmana 14.07.2011 17:04
12

Není to přesně odpověď, kterou byste chtěli slyšet, ale možné použití escape sekvence je zajištěno bash

command | grep $'\t'

(nezadávejte jej do dvojitých uvozovek!).

    
odpověděl enzotib 14.07.2011 16:15
2

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

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

Výstup:a\t.

    
odpověděl Ciro Santilli 新疆改造中心 六四事件 法轮功 28.08.2016 13:15
1

Vždy se můžete uchýlit k použití hexadecimálního kódu ascii:

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

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

$ grep $'\x9' input.txt                                            
one two
    
odpověděl Sergiy Kolodyazhnyy 03.07.2017 19:04