Existe alguma maneira de grep interativamente , o que significa que tenho um monte de linhas vindo de algum lugar que desejo canalizar para processamento posterior, com a opção de especificar manualmente as linhas que desejo?
Considere este exemplo:
#Name Food Music
Adam Cake Rock
Bert Fruit Folk
Caesar Cake Rock
Doris Cake Folk
Emil Fruit Rock
Francis Fruit Folk
Gertrud Cake Rock
...
Posso pegar esse arquivo e filtrá-lo usando linhas como
cat people.txt | grep -v "^#" | grep "^.*Fruit.*Folk"
...para convidar todas as pessoas para uma festa Folclórica Vegetariana. Quando eu automatizo isso ainda mais:
cat people.txt | grep -v "^#" | grep "^.*Fruit.*Folk" | ??? | peopleInviterScript
...Quero ter algum ???
no pipe que me dê a opção de selecionar/desmarcar pessoas antes que os convites sejam enviados.
Já existe tal ferramenta em bash/zsh que eu simplesmente não conheço?
Embora goste da
vipe
abordagem, encontrei uma maneira ainda mais legal: fzf ....fornece uma boa lista onde posso pesquisar e alternar os itens com o teclado e desaparece completamente quando termino.
moreutils tem
vipe
, que apenas executa seu editor de texto regular (vi ou algo assim) como parte do pipeline. Quaisquer linhas que você não excluir serão gravadas de volta no stdout. (Em geral, porém, você obtém o mesmo resultado redirecionando para um arquivo temporário e editando esse arquivo.)Você também pode usar
gvim
(evim
) para isso. Insiragvim /dev/stdin
em seu pipe e escreva fazendo:wq! /dev/stdout
quando terminar de editar.Chamar gvim como o seguinte permite que você escreva e feche com mais naturalidade
ZZ
:Você pode fazer um alias ou uma função disso:
Aqui está um exemplo onde apaguei as linhas 4-7 e terminei fazendo
ZZ
no modo normal:EDIT: O vim regular é um pouco mais complicado, porque usa stdin para entrada de teclado e stdout para desenhar a interface do usuário. No entanto, você ainda pode usá-lo adicionando um processo extra. Você redireciona o std* do vim para o terminal e usa o std* do processo pai para o canal de dados.
O arquivo temporário é necessário porque, caso contrário, a saída do pipe será misturada com a interface do usuário do vim e poderá desaparecer com ele quando o vim sair.