Vinicius Baggio Fuentes

  1. Software Engineer — Medium
  2. Autor — Casa do Código
  3. Compre já!
24 Aug 2010 — 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.

Leia também

blog comments powered by Disqus