Sed, Grep e afins

Wanderley Caloni, 2008-03-10.

Esse artigo é resultado de eu ter me matado para conseguir encontrar a forma correta de usar o aplicativo sed para fazer uma filtragem simples nos resultados de uma listagem de arquivos.

Primeiramente, eu gostaria de expressar minha total surpresa ao não conseguir encontrar um guia simples e confiável de uso dessas ferramentas na web. Existem três teorias: ou eu não sei usar as palavras mágicas certas no Google, ou a indexação das páginas realmente importantes sobre o assunto não funcionam com o Google, ou de fato não existe documentação fácil sobre o tema.

Como esta é uma exceção em anos de "googadas", eu fico com a terceira opção.

Algumas explicações que merecem ser explicadas

Existem algumas ferramentas que já salvaram minha vida uma dúzia de vezes e devo admitir que são tão poderosas e flexíveis quanto difíceis de usar:

O que eu queria era processar a saída de um programa de forma que eu tivesse a lista de todas as extensões dos arquivos. Por exemplo, para a seguinte entrada:

c:\path\arquivo1.cpp
c:\path\arquivo2.h
c:\arquivo3.hpp
c:\path\path2\arquivo4.cpp

Eu gostaria de uma saída no seguinte formato:

.cpp
.h
.hpp

Basicamente é isso.

Sabendo que processamento de entrada estaria envolvido, logo pensei em utilizar o sed para a tarefa. Justiça seja feita, depois de eu perder uma hora e meia em pesquisa eu encontrei um tutorial muito bom para quem está começando a entender melhor o funcionamento do sed, e é nele que me baseei para resolver meu problema e escrever este artigo.

Para filtrar o _path _do arquivo, e ao mesmo tempo retirar seu nome, podemos usar o seguinte comando (fora outras trilhões de variantes):

programa | sed -e "s/^.*\\//" -e "s/.*\.\(.*\)/\1/"

Após esse processamento, a saída é um monte de extensões vindas de um monte de arquivos:

cpp
h
cpp
h
c
h
cpp
h
mak
vcproj
h
cpp
h
cpp
h
cpp
h
cpp
h
c
h
txt
c
cpp
h
mak
vcproj
cpp
h
...

Como podemos ver e é óbvio de imaginar, muitas extensões irão se repetir. Para eliminar as repetições e ordenar a saída da saída corretamente, usamos o comando sort:

programa | sed -e "s/^.*\\//" -e "s/.*\.\(.*\)/\1/" | sort -u

Algumas coisas que eu (re)aprendi hoje

draft blog discuss