Busca-substituição recursiva usando sed com URLs

3

Eu tenho um grande conjunto de arquivos em que preciso substituir um esquema de URL completo. Alguns nomes de arquivos contêm espaços. Depois de muita pesquisa e rial e erro, este é o mais próximo que cheguei:

find /somedir -type f -print0 -exec sed -i'' -e 's#http\:\/\/domain.com#https\:\/\/www.domain.com#g' {} +

O arquivo resultante tem o esquema http: removido, deixando o // - por exemplo, '//www.dominio.com'

Além disso, um novo arquivo é criado, anexando -e ao nome do arquivo. - ou seja, some file.php-e que obviamente não é desejado.

Embora isso certamente seja suficiente (depois de remover os arquivos *-e , o OCD em mim realmente quer saber como fazer isso corretamente. Nota: Estou trabalhando localmente em um Mac, mas também realizarei isso no linux.

Qualquer ideia é muito apreciada!

    
por Chris Chapman 21.07.2015 / 16:25

1 resposta

2

Solução 1 : uma maneira é usar find com xargs :

find /dir -type f -print0 | xargs -0 sed -i 's#http://domain.com#https://www.domain.com#g'

Solução 2 : outra seria usar find com -exec , muito semelhante à sua pergunta:

find /dir -type f -exec sed -i 's#http://domain.com#https://www.domain.com#g' {} +

Ambas as soluções chamam sed com vários arquivos como argumentos. Portanto, sed não é chamado uma vez para cada arquivo, mas para cada conjunto de arquivos.

Solução 3 : em vez de sed , você também pode usar perl para a tarefa de substituição de pesquisa:

perl -i -pe 's#http://domain.com#https://www.domain.com#g' file

Combinado com o comando find / xargs :

find /dir -type f -print0 | xargs -0 perl -i -pe 's#http://domain.com#https://www.domain.com#g'
    
por 21.07.2015 / 16:56

Tags