Por que o ag está imprimindo linhas em branco deste arquivo?

0

Eu quero usar ag para imprimir as classes e seus métodos em um arquivo python. Eu pensei que isso seria fácil usando:

ag --context=0 --nocolor -os '^\s*(def|class)\s+[_A-Za-z]*' prog.py

mas por razões que eu não entendo isso também é compatível com linhas em branco. Por exemplo, se você fizer prog.py o seguinte

class MyFavouriteClass
    def __init__

    def __contains__
        blah    
class MyNextFavouriteClass
    def _repr_

    def __iter__

então retorna o arquivo completo, incluindo as linhas em branco, exceto para a linha contendo blah . Claro, eu sempre posso canalizar a saída em outra coisa para remover as linhas em branco, mas eu prefiro acertar na primeira vez.

Eu suspeito que o problema não tenha nada a ver com a expressão regular e, em vez disso, que é um recurso de ag --context , --after e --before flags, mas não consigo encontrar uma combinação destes que faz o que eu quero.

Alguma idéia?

    
por Andrew 10.08.2016 / 08:46

1 resposta

4

Não é o --context , mas o \s* no início do seu padrão de expressão regular. Parece que ag não pesquisa linha por linha como o normal grep , mas olha o arquivo inteiro de uma só vez (ou pelo menos várias linhas por vez). Um pouco como este Perl one-liner seria:

perl -0777 -ne 'print "$&\n" while /^\s*(def|class)\s+[_A-Za-z]*/msg' ../prog.py

Portanto, como \s corresponde a qualquer espaço em branco, incluindo novas linhas, ele corresponde à linha vazia anterior, à nova linha, aos espaços à frente da próxima e, em seguida, à palavra-chave def . Se você adicionar uma linha vazia antes da linha blah , ela não será impressa, pois blah não se ajusta ao padrão.

Para se livrar da correspondência indesejada, use /^ *... ou /^[ \t]*... em vez de /^\s*... . (espaço + asterisco no primeiro)

    
por 10.08.2016 / 09:46