Como posso imprimir a declaração completa da função de qualquer função que tenha uma string específica dentro dela?

4

Eu tenho muitas funções no meu bashrc , mas para as recém-criadas, muitas vezes esqueço o nome da função.

Então, por exemplo, quando eu defini essa função no meu .bashrc :

function gitignore-unstaged
{
    ### Description:
    # creates a gitignore file with every file currently not staged/commited.
    # (except the gitingore file itself)
    ### Args: -

    git ls-files --others | grep --invert-match '.gitignore' > ./.gitignore

}

E eu gostaria de ter outra função que imprime a definição da função como:

$ grepfunctions "gitignore"
function gitignore-unstaged
{
    ### Description:
    # creates a gitignore file with every file currently not staged/commited.
    # (except the gitingore file itself)
    ### Args: -

    git ls-files --others | grep --invert-match '.gitignore' > ./.gitignore
}

Mas, em vez de corresponder a "gitignore", quero que corresponda a cada string entre funtction e } , por isso $ grepfunctions "###" e $ grepfunctions "creates" devem produzir exatamente a mesma coisa. Essa também é a razão, por que declare -f e isso não resolve o problema .

O que tentei

  • Não posso usar grep
  • Eu sei que sed -n -e '/gitignore-unstaged/,/^}/p' ~/.bashrc imprime o que eu quero - mas sed -n -e '/creates/,/^}/p' ~/.bashrc não. Em vez disso, recebo:

        # creates a gitignore file with every file currently not staged/commited.
        # (except the gitingore file itself)
        ### Args: -
    
        git ls-files --others | grep --invert-match '.gitignore' > ./.gitignore
    }
    

    O nome da função e o primeiro { estão recortados, o que não é o que eu quero.

Como posso imprimir a declaração de função completa de qualquer função que tenha uma string específica dentro dela? Claro, outras ferramentas além do sed também são permitidas.

    
por toogley 08.11.2016 / 17:37

1 resposta

5

Note que com zsh , você pode fazer:

 printf '%s() {\n%s\n}\n\n' ${(kv)functions[(R)*gitignore*]}

Para recuperar as informações das funções atualmente definidas (isso não inclui os comentários, obviamente).

Agora, se você quiser extrair as informações do arquivo de origem, não poderá fazê-lo de maneira confiável, a menos que implemente um analisador de shell completo.

Se você puder fazer alguma suposição sobre como suas funções são declaradas, como por exemplo, se você sempre usa essa definição de função ksh-style, com function e } no início da linha, você poderia fazer:

perl -l -0777 -ne 'for (/^function .*?^\}$/gms) {
  print if /gitignore/}' ~/.bashrc

ou para procurar apenas no corpo da função:

perl -l -0777 -ne 'for (/^function .*?^\}$/gms) {
  print if /\{.*gitignore/s}' ~/.bashrc
    
por 08.11.2016 / 18:06