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