Novamente, compartilharei uma demanda que atendi muitas vezes e, quase sempre, acabo refazendo o script. Por ser útil para administradores (alterações de conteúdo em massa – em vários arquivos), resolvi compartilhá-lo.

No primeiro caso, aceitaremos alterar uma ocorrência exata nos arquivos, sem questionar cada linha alterada – muito comum em configurações de DNS (por exemplo):
#!/bin/bash
diretorio="/LOCALIZACAO/DOS/ARQUIVOS"
consultar="VALOR_X"
trocar="NOVO_VALOR_Y"
clear
for line in $(ls $diretorio/* 2>/dev/null); do
echo "\n\n==> Arquivo $line"
grep "\b$consultar\b" $line && {
echo -n "\nAlterar conteúdo (para *$trocar*)? (S/N) "
read alterar
case "$alterar" in
s|S)
sed -i "s/\b$consultar\b/$trocar/g" $line
;;
esac
}
done
Outra alternativa, bastante interessante, é utilizar a mesma lógica permitindo uma consulta aproximada, com confirmação linha a linha:
#!/bin/bash
diretorio="/LOCALIZACAO/DOS/ARQUIVOS"
consultar="VALOR_X"
trocar="NOVO_VALOR_Y"
clear
for line in $(ls $diretorio/* 2>/dev/null); do
echo "\n\n==> Arquivo $line"
grep "\b$consultar\b" $line && {
echo -n "\nAlterar conteúdo (para *$trocar*)? (S/N) "
read alterar
case "$alterar" in
s|S)
vim -c "%s/$consultar/$trocar/gc" -c 'wq' "$line"
;;
esac
}
done
Pois é, trata-se de um script simples e eficiente…
No primeiro caso, o script fará uma busca exata pela string e fará alteração de múltiplas ocorrências dentro do arquivo sem pedir confirmação para cada linha encontrada. Sendo assim, optamos pelo sed.
O segundo exemplo não é “muito diferente”. Apenas optamos pelo vim, permitindo que o próprio editor navegue pelos arquivos pedindo a confirmação para cada linha com a string localizada. É útil quando se necessita de um cuidado maior com o conteúdo (onde nem sempre queremos alterar).
No Comments Yet