você está aqui: Home  → Arquivo de Mensagens

Global Replace

Colaboração: Rubens Queiroz de Almeida

Data de Publicação: 20 de Maio de 1997

Este shell script pode vir a ser útil. O que ele faz é simplesmente trocar todas as ocorrências de determinada string por uma outra em um número de arquivos especificados na linha de comando, aceitando inclusive wildcards.

Por exemplo, o comando

$ repl rubens joao *

substituiria todas as ocorrências de rubens por joao em todos os arquivos do diretório corrente.

Além disto, este shell script aborda alguns pontos interessantes com relação à programação shell.

O código do shell foi comentado para esclarecer as técnicas de programação.

#!/bin/bash

# Teste para verificar se todos os
# argumentos foram passados na linha de
# comando (mínimo de 3, duas strings (de,
# para) e nome(s) do(s) arquivo(s). Se
# nao, sai e envia mensagem de erro

if [ $# -lt 3 ]
then
	echo "Uso $0: DE-argumento PARA-argumento arquivos" >&2
	exit 1
fi

# atribui à variável DE o valor da
# string a ser substituída e desloca as
# variáveis ($3 passa a ser $2, $2 passa
# a ser $1) O deslocamento das variáveis
# é feito com o comando shift

DE=$1; shift

# atribui à variável PARA o valor final
# da string $1 agora é o argumento de
# número 2, string destino.

PARA=$1;   shift

# Na entrada do laço, $1 representa o
# nome do primeiro arquivo onde serão
# efetuadas as alterações

until [ $# -eq 0 ]

# Continua no laço até que o número de
# argumentos seja igual a zero ou seja,
# até que não existam mais arquivos a
# serem processados.

do

# Testa a existência do arquivo

	if [ ! -r $1 ]
	then	echo "no file $1" >& 2;shift

# A modificação nos arquivos é feita
# com o comando sed, que redireciona
# a saída para um arquivo temporário,
# que irá possuir o nome do shell ($0)
# seguido do número de identificação do
# processo ($$)

	else 	sed -e "s/$DE/$PARA/g" $1 > /tmp/$0$$
		mv /tmp/$0$$ $1;
		echo "alteracoes efetuadas em $1" >&2
		shift
	fi
done


Veja a relação completa dos artigos de Rubens Queiroz de Almeida