Como grep para guias sem o uso de guias literais e por que não funciona?

112

Quando procuro por guias em um arquivo com (e) grep, eu uso a guia literária ( ^v + <tab> ). Eu não posso utilizar \t como um substituto para guias em expressões regulares. Com p. sed esta expressão funciona muito bem.

Então, existe alguma possibilidade de usar um substituto não-litteral para <tab> e quais são os fundos para um não funcionando / não interpretado \t ?

    
por Lasall 14.07.2011 / 13:59

4 respostas

158

O grep está usando expressões regulares, conforme definido por POSIX . Por alguma razão, POSIX não definiu \t como guia.

Você tem várias alternativas:

  • diga ao grep para usar as expressões regulares conforme definido por perl (perl tem \t como tab):

    grep -P "\t" foo.txt
    

    a página man avisa que este é um recurso "experimental". pelo menos \t parece funcionar bem. mas os recursos mais avançados de regex perl não podem.

  • use o printf para imprimir um caractere de guia para você:

    grep "$(printf '\t')" foo.txt
    
  • use o caractere de tabulação literal:

    grep "^V<tab>" foo.txt
    

    ou seja: digite grep " , pressione ctrl+v , pressione tab e digite " foo.txt . Pressionar ctrl+v no terminal faz com que a próxima tecla seja digitada na íntegra. isso significa que o terminal irá inserir um caractere de tabulação em vez de acionar alguma função vinculada à tecla tab.

  • use o recurso ansi coting do bash:

    grep $'\t' foo.txt
    

    isso não funciona em todos os shells.

  • use o awk:

    awk '/\t/'
    
  • use sed:

    sed -n '/\t/p'
    

Veja o artigo da wikipedia sobre expressões regulares para uma visão geral das classes de caracteres definidas no POSIX e em outros sistemas.

    
por lesmana 14.07.2011 / 17:04
12

Não é exatamente a resposta que você gostaria de ouvir, mas um possível uso de seqüências de escape é fornecido pelo bash

command | grep $'\t'

(não coloque entre aspas duplas!).

    
por enzotib 14.07.2011 / 16:15
2

awk '/\t/' é a minha solução favorita:

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

Saída: a\t .

    
1

Sempre é possível recorrer ao uso do código hexadecimal ascii para a guia:

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

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

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