Aqui vou explicar como substituir palavras ou expressões num conjunto de ficheiros, tudo ao mesmo tempo. A execução é extremamente rápida e útil para quem precisa de alterar a mesma palavra ou expressão em muitos ficheiros.
Hoje, enquanto redigia um texto em Latex, estava a usar uma variavel com letras minúsculas que eu não estava a gostar de a usar. Comecei a fazer o documento com essa variável (através do \newcommand do Latex) e não me importei de como ela estava definida.
Com o passar do tempo, e agora com muitos ficheiros de texto, deparo-me com essa variável que por vezes confunde-me. Ora, decidi então substituir todas as ocorrências dessa variável por algo mais sugestivo. Como o fiz? Utilizei o terminal!
Basicamente, recorrendo a este comando conhecido, consegui alterar todas as ocorrências nos vários ficheiros em apenas milésimos de segundo. Foi simplesmente carregar no enter e mandar o latex compilar a ver se estava tudo funcional. E estava claro.
Comando que faz as substituições
O comando que usei foi o seguinte e substitui todas as ocorrências de "isto" em "aquilo" em todos os ficheiros com a extensão ".tex":
find . -name "*.tex" -print | xargs sed -i 's/isto/aquilo/g'
Explicação do comando
Este comando é constituído por dois comandos distintos.
O primeiro comando (find) procura todos os ficheiros que acabem com a extensão ".tex" na pasta atual que você se encontra no terminal. A localização da procura é definida pelo ponto, que significa localização atual. Já a extensão é definida através do asterisco que indica que é qualquer coisa e depois terminada em .tex.
Relativamente ao segundo comando, ele recebe os vários ficheiros do primeiro comando e por cada ficheiro vai fazer uma substituição direta em tudo o que encontrar entre as duas primeiras barras por o que encontrar entre as duas últimas barras. Ou seja, neste caso em concreto vai substituir todas as ocorrências de "isto" por "aquilo".
Dentro destas barras pode-se incluir expressões regulares mais complexas conforme as necessidades de cada um.
Exemplos mais complexos
Neste caso, quis substituir todas as ocorrências da palavra "\section" que ocorre muitas vezes em latex. Repare-se que tem uma barra. É preciso fazer o escape em certos símbolos, nomeadamente em barras. E portanto se se eu quiser subsituir essa palavra por "\subsection", faço o seguinte:
find . -name "*.tex" -print | xargs sed -i 's/\\section/\\subsection/g'
Por outro lado, quando estou a redigir em latex costumo usar uma biblioteca que permite escrever anotações. Essas anotações normalmente são do tipo "\todo{notas sobre alguma coisa}" ou até "\todo[inline]{notas que ocupam a largura do texto}". Ora como no final da redação dos textos, convém apagar essas notas. A biblioteca permite escondê-las. Mas se eu quiser apagar apenas faço o seguinte:
find . -name "*.tex" -print | xargs sed -i 's/\\todo.*\}//g'
Podia mostrar muitos outros exemplos mas nunca iriam satisfazer as necessidades de cada um. Por isso, quem precisar de fazer algo assim mais complexo, basta ler um pouco de expressões regulares: