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.

https://hackaday.com/wp-content/uploads/2016/08/editor-wars-vim.jpg?w=800

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).