Usando variáveis para alterar arquivos com sed, *grep e outros

Publicado por Davidson Rodrigues Paulo em 21/04/2006

[ Hits: 17.387 ]

Blog: http://davidsonpaulo.com/

 


Usando variáveis para alterar arquivos com sed, *grep e outros



Quem usa Linux e programa em Shell Script com certeza já precisou fazer alguma alteração num arquivo usando interpretadores de expressões regulares como sed, egrep e outros. Entretanto, esses comandos não possuem a função de aplicar modificações no arquivo de origem (as versões mais recentes do sed possuem essa função) e, em todos os lugares onde eu procurei uma orientação sobre o que fazer, a recomendação era de criar um outro arquivo e então substituir o arquivo antigo pelo outro. Algo assim:

$ sed [comando] [arquivo] > [arquivo].new
$ mv [arquivo].new [arquivo]


Bom, acontece que eu acabei descobrindo um jeito de fazer a mesma coisa sem criar nenhum novo arquivo. Basta usar variáveis de ambiente. Isso mesmo. Veja como poderíamos fazer a mesma coisa acima citada usando essa técnica:

$ TEXTO=`sed [comando] [arquivo]`
$ echo "$TEXTO" > [arquivo]


A grande vantagem desse método é a maior velocidade que se ganha, já que as variáveis ficam armazenadas em memória, sendo manipuladas muito mais rapidamente do que arquivos armazenados em disco.

Você pode ver um exemplo prático de aplicação dessa técnica no script de instalação que eu desenvolvi para o pacote para Slackware do Squid. Esse script atualiza o arquivo /etc/rc.d/rc.M, inserindo uma entrada para a inicialização em tempo de boot do Squid.

Eu usei o sed no exemplo, mas poderia ter usado qualquer outro programa. O procedimento é o mesmo para outros comandos.

Agradecimentos ao amigo Elias que me apontou uma pequena falha que eu estava cometendo nesse procedimento. Valeu Elias!

Outras dicas deste autor

Corrigindo nomes de arquivos com charset errado

Como ser mais produtivo

Criando menu para o Fluxbox automaticamente

Como habilitar o teclado ABNT2 no Vyatta

Como juntar dinheiro para cursos e certificações

Leitura recomendada

Compilar programas com muitos parâmetros

Variável de numero inteiro ou float

Como exibir números com um largura fixa de caracteres, complentando com zeros a esquerda

DictConv: Converta dicionários do Babylon para o StarDict

Operações matemáticas diretamente pelo bash

  

Comentários
[1] Comentário enviado por jose_maria em 21/04/2006 - 22:38h

Boa idéia!
No meu próximo script eu vou testar isso ;)

[2] Comentário enviado por PCMasterPB em 22/04/2006 - 20:38h

O link do script de exemplo está quebrado ou errado, não sei ao certo, mas o que interessa é que está inacessível. Eu gostaria de ver o script. Mas a dica é boa. Té mais. ;D

[3] Comentário enviado por fabricio_ em 24/04/2006 - 09:27h

no sed :
sed -i

man sed :

-i[SUFFIX], --in-place[=SUFFIX]

edit files in place (makes backup if extension supplied)

sed --version
GNU sed version 4.1.4
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
to the extent permitted by law.




[4] Comentário enviado por davidsonpaulo em 24/04/2006 - 10:30h

PCMasterPB,

Acabei de checar o link, e descobri algo muito chato: o servidor onde está hospedado o Bozolinux (e o script de exemplo) não foi pago pelo patrocinador e ele está fora do ar... =( Vou ter que correr atrás do lucro e ver como posso voltar a situação ao normal.

fabricio_,

Sim, esqueci de mencionar na dica que algumas versões do sed (as mais recentes) possuem a opção -i que pode ser usada para gravar no arquivo.

Abraços

[5] Comentário enviado por sampaioprimo em 14/06/2006 - 11:06h

olá, estou acostumado a usar o awk. alguém saberia me dizer se esta linguagem possui alguma opção semelhante ao -i mencionado para o sed? obrigado, rodrigo.



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts