grep com heredoc em função

2

Eu quero fazer uma função que analise o texto colado em um terminal.

$ cat <<eof | grep --color sometext
> foo
> sometext
> sometext1
> a sometext
> asdf
> 
> eof
sometext
sometext1
a sometext

Enquanto os trabalhos acima não posso fazer nem um apelido nem uma função dele.

alias gsi='cat <<eof | grep --color "$1"'
gsi { cat <<eof | grep --color "$1" ; }

Eu pensei que os redirecionamentos não foram executados durante a definição da função.

    
por 1.61803 15.08.2018 / 16:15

3 respostas

5

alias 'gsi=<<eof grep --color'

Funcionar como alias é como a substituição de texto do pré-processador, em que a substituição é interpretada como código de shell novamente.

O seu não estava funcionando como você tinha que "$1" . Com gsi file.txt substituído por cat <<eof | grep --color "$1" file.txt , o shell continua a interpretar essa linha de comando e $1 nesse ponto é o primeiro parâmetro posicional do shell que provavelmente está vazio, a menos que você tenha feito um set something antes. Então, você deseja remover esse "$1" aqui. Você pode remover o UUOC também.

gsi() { cat <<eof | grep --color "$1" ; }

está errado de um ponto de vista de sintaxe, pois a linha eof está ausente depois desse cat <<eof .

    
por 15.08.2018 / 16:26
4

Sua função não estaria usando um documento aqui:

gsi () {
   grep --color "$@"
}

Isso permitiria que você passasse um padrão, bem como quaisquer outras opções para grep na linha comum e grep leria da entrada padrão.

O final da entrada será sinalizado pressionando Ctrl + D .

O acima poderia misturar o conteúdo colado e o resultado de grep . Para acumular o conteúdo colado primeiro e então executar grep , você poderia usar algo como

gsi () {
    trap 'rm -f "$buffer"' RETURN
    local buffer="$(mktemp)"
    cat >"$buffer" && grep --color "$@" "$buffer"
}

Aqui, a saída colada é colocada em um arquivo temporário antes que o grep seja executado. O arquivo temporário é removido quando a função é encerrada. Isso é aproximadamente o que bash faria nos bastidores quando você cola em um documento aqui.

    
por 15.08.2018 / 16:30
2

Você mencionou que está colando no terminal. Abandonar aqui-doc completamente, e use um utilitário de clipboard adequado, como xclip (ou pbpaste no Mac OS X). Com xclip isso seria feito como

xclip -o -sel clip | grep --color 'sometext'

Veja também 'xclip' x 'xsel' sobre a diferença entre os dois utilitários.

    
por 15.08.2018 / 18:07