vinibaggio.net

Filtros

Filtros

No Vim, é possível filtrar o conteúdo de um buffer em um comando do shell. Sabemos que as aplicações *nix são do tipo “faça uma coisa e faça-a bem”. Então, temos várias coisas úteis, como uniq, grep, cut, awk, egrep e etc. Dessa forma, podemos combinar os dois e fazer algumas coisas interessantes.

O primeiro exemplo é de como podemos pegar o conteúdo em um buffer do Vim e obter apenas as entradas únicas:

Conteúdo:

a@a.com
a@a.com
b@b.com
c@c.com

Assim, com esse conteúdo, podemos executar: :%!uniq. O resultado é:

a@a.com
b@b.com
c@c.com

O comando é simples. Com o conteúdo de todo o buffer, passe para o comando do shell (identificado por !, pois podemos executar coisas como :!mkdir /bla) e coloque o resultado no próprio buffer.

Eu tive que fazer algo parecido com isso ontem. Eu tinha um arquivo com várias entradas (cerca de 9000) e precisava de apenas entradas cujos emails não estavam contidos em outra lista. Dessa forma, o que eu fiz foi o seguinte:

entradas:

Entrada1: a@a.com, x, y, z, theta
Entrada2: b@b.com, x, y, z, theta
Entrada3: c@c.com, x, y, z, theta

blacklist:

b@b.com

Assim, com o buffer “entradas” aberto, para filtrar o conteúdo, bastou executar :%!fgrep -vf blacklist. O grep apenas exibe comandos que dão match, enquanto o parâmetro -v faz a inversão disso, ou seja, eu quero as entradas que não ocorra match. O -f é para obter os matches de um arquivo. Dessa forma o resultado fica:

Entrada1: a@a.com, x, y, z, theta
Entrada3: c@c.com, x, y, z, theta

Mais detalhes sobre isso em Vim piping.


Vinicius Baggio Fuentes

Written by Vinicius Baggio Fuentes, who works in tech in NY but would rather be in the kitchen all the time. Twitter Instagram