[Dicas-L] Global Replace
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 determinado string por uma outra em uma número de arquivos especificados na linha de comando, aceitando inclusive wildcards.
% 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 da shell foi comentado para esclarecer as técnicas de programação.
# 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
echo "Uso $0: DE-argumento PARA-argumento arquivos" >&2
# 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
# 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.
# Testa a existência do arquivo
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
Um executivo de uma companhia ganhou um convite para um concerto da Sinfonia Inacabada de Schubert. Como estaria impossibilitado de comparecer, passou o convite para o Gerente de MÚtodos e Procedimentos. Na manha seguinte, o executivo perguntou se ele tinha gostado e, ao inves de comentarios, recebeu o seguinte memorando :
1. Por um periodo consideravel de tempo, os musicos com oboe nao tinham nada para fazer. Sua quantidade deveria ser reduzida e seu trabalho redistribuido pela orquestra, evitando estes picos de inatividade. 2. Todos os doze violinos tocavam notas identicas. Isto parece ser uma duplicidade desnecessaria de esforcos. O contingente nesta secao deveria ser drasticamente cortado. Se um alto volume de som e requerido, isto pode ser obtido atraves de um amplificador. 3. Muito esforco foi envolvido em tocar semitons. Isto parece ser um preciosismo desnecessario e seria recomendavel que todas as notas fossem arrendondadas para o tom mais proximo. Se isto fosse feito, poder-se-ia utilizar estagiarios em vez de musicos profissionais. 4. Nao havia utilidade pratica em repetir com os metais a mesma passagem ja tocada pelas cordas. Se toda esta redundancia fosse eliminada, o concerto poderia ser reduzido de duas horas para apenas vinte minutos.
Sumarizando as observacoes anteriores, podemos concluir que, se Schubert tivesse dado um pouco mais de atencao a estes pontos, talvez tivesse tido tempo de acabar sua sinfonia.