Resposta
Se você não está preocupado com a velocidade (esta é uma tarefa única), então talvez você possa tentar isto:
cat map.txt | while read line; do
neww=${line##* };
oldw=${line%% *};
find /some/folder -type f -exec sed -i "s/$oldw/$neww/g" {} \;
done
Não é o melhor, eu sei ... :-P
PS: verifique em uma pasta de teste para ver se funciona!
Explicação
Basicamente:
- Cat file map.txt.
- Leia cada linha e faça com que a palavra seja substituída por
$oldw
e a substituição$neww
. - Para cada par, execute o comando find que você já estava usando (observe as aspas duplas desta vez para permitir a substituição de variáveis).
Sobre a expansão de parâmetros
Para definir as variáveis $oldw
e $neww
, precisamos obter a primeira e a última palavra de cada linha. Para fazer isso, estamos usando a expansão de parâmetros (pura implementação de Bash), embora pudéssemos ter usado outras maneiras de obter a primeira e a última palavra da string (por exemplo, cut
ou awk
).
-
${line##* }
: da variávelline
, remova o maior padrão de prefixo (double#
), em que pattern é qualquer caractere (*
) seguido por um espaço (). Então, temos a última palavra em
line
. -
${line%% *}
: da variávelline
, remova o maior padrão de sufixo (double%
), em que pattern é um espaço () seguido por qualquer caractere (
*
). Então, obtemos a primeira palavra emline
.
As palavras foram separadas por um espaço neste caso, mas poderíamos ter usado um separador.