Como pesquisar e substituir strings correspondentes a uma lista de substituição para vários arquivos

4

Eu tenho um arquivo, digamos map.txt , contendo uma lista de strings de pesquisa e substituições correspondentes:

search -> replacement
bigBone -> bb
fishMarket -> fm
dogCollar -> dc
...

Eu preciso executar a pesquisa e a substituição de todas as strings que correspondam ao acima para todos os arquivos recursivamente em uma pasta, exceto os links simbólicos. Eu sei como fazer um de cada vez assim:

$ find /some/folder -type f -exec sed -i 's/old_text/new_text/g' {} \;

Como posso executar isso em grande escala usando o mapeamento acima? Eu li esta questão , mas não entendi bem.

    
por Question Overflow 06.05.2014 / 16:19

2 respostas

4

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:

  1. Cat file map.txt.
  2. Leia cada linha e faça com que a palavra seja substituída por $oldw e a substituição $neww .
  3. 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ável line , 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ável line , remova o maior padrão de sufixo (double % ), em que pattern é um espaço ( ) seguido por qualquer caractere ( * ). Então, obtemos a primeira palavra em line .

As palavras foram separadas por um espaço neste caso, mas poderíamos ter usado um separador.

    
por 06.05.2014 / 16:40
0

Às vezes, preciso pesquisar e substituir os termos nos arquivos de configuração.

Eu escrevi um script disponível no github sandr - pesquisar e substituir , que permite criar / usar um mapa e executar a substituição em arquivos.

Um exemplo de uso:

%pr_e%

    
por 06.05.2014 / 17:33