Localizar-substituir recursivamente usando sed com URLs

Localizar-substituir recursivamente usando sed com URLs

Tenho um grande conjunto de arquivos nos quais preciso substituir um esquema de URL completo. Alguns nomes de arquivos contêm espaços. Depois de muita pesquisa, 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 //- ou seja, '//www.domain.com'

Além disso, um NOVO arquivo é criado, anexado -eao nome do arquivo. - ou seja some file.php-e, que obviamente indesejado.

Embora isso certamente seja suficiente (depois de remover os *-earquivos, o TOC em mim realmente quer saber como fazer isso corretamente. Nota: estou trabalhando localmente em um Mac, mas também farei isso no Linux.

Qualquer ideia é muito apreciada!

Responder1

Solução 1: Uma maneira é usar findcom 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 findwith -exec, bem parecido com a sua pergunta:

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

Ambas as soluções chamarão sedvários arquivos como argumentos. Portanto, sednã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 perlpara search-replace-job:

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'

informação relacionada