Software Design

Design de software em C, C++, Java, etc…

Dica Rápida sed + regex: Adicionando std:: antes de todos “exception”

Precisei recompilar um software legado escrito em C++ e para minha surpresa o código não compilava porque em vários arquivos a classe exception estava sendo referenciada sem o prefixo std:: e sem using namespace, por isso o g++ acusava o seguinte erro: “error: ISO C++ forbids declaration of `exception’ with no type”

Fiz um grep recursivo no diretório e a quantidade de linhas que tinha esse tipo de código era grande demais para fazer essas alterações manualmente, então fui atrás de algo automatizado. A primeira coisa que veio em mente foi utilizar o SED. Após alguns minutos de pesquisa, cheguei ao seguinte script:

#!/bin/bash
for file in $(find . -iname \*.cpp); do
  sed -i.bkp -r 's/(catch.*[^:])(exception)/\1std::\2/' $file
  echo $file;
done;

Primeiro o comando find é executado para listar todos os arquivos com extensão .cpp, depois o for pega essa lista e pra cada item executa o sed que fará a busca e troca inplace ( parâmetro -i ) criando um arquivo com o mesmo nome e extensão .bkp como backup.

Desmembrando a regex:
1) (catch.*[^:]) cria um grupo de captura contendo a parte inicial da expressão(desde o bloco catch), porém ignorando linhas que já contenham o std:: antes do exception
2) (exception) cria o segundo grupo de captura ( procurando a string exception após o bloco catch)
3) \1std::\2 concatena o primeiro grupo de caputra, adicionando std:: e o segundo grupo de captura.

Basicamente é isso, com esse script simples troquei horas de tédio para fazer a alteração manual por alguns minutos de diversão compondo o script.

Após ter dado tudo certo, basta executar um find pra apagar os arquivos .bkp:

find . -iname \*.bkp -exec rm -f {} \;

Espero que seja útil pra alguém.

Referênciahttp://www.grymoire.com/Unix/Sed.html

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

Informação

Publicado às janeiro 28, 2013 por em C++, Regex e marcado , , , .
%d blogueiros gostam disto: