recursivamente substitui cada instância de uma palavra em um diretório da linha de comando do linux

0

Eu tenho um diretório com vários subdiretórios que contêm arquivos de texto. Nestes arquivos de texto, há uma certa palavra que ocorre repetidamente, e eu quero substituir todas as instâncias.

Minha pergunta - Como eu conseguiria isso de uma linha de comando do Linux? Eu não quero gedit todos os arquivos e fazer uma busca manual / substituir.

(Para um bônus - existe uma maneira de fazer isso de uma maneira que não diferencia maiúsculas de minúsculas?)

    
por slightlyparallel 10.07.2010 / 21:14

2 respostas

5

Você pode usar find e perl (via xargs ):

find /target/directory -type f | xargs perl -pi -e 's/stringtoreplace/replacement/g'

ou se você já estiver no diretório correto

find . -type f | xargs perl -pi -e 's/stringtoreplace/replacement/g'

e se você quiser substituir apenas, digamos, arquivos html:

find . -type f -name '*html' | xargs perl -pi -e 's/stringtoreplace/replacement/g'

Você não precisa usar o perl, é claro, qualquer ferramenta que realize operações de busca e substituição fará, e não duvidar de que existem vários disponíveis com menos recursos do que iniciar o perl (que neste caso é um trenó para quebrar uma noz, mas é um exemplo que eu tinha armazenado por muito tempo e não tenho motivos para encontrar uma versão mais eficiente). Minha fonte original para o "truque" é link

Você pode usar todas as opções de cada ferramenta escolhida, portanto, neste caso, o poder total das expressões regulares do Perl. A página vinculada acima tem mais exemplos, incluindo como pesquisar em um caso de maneira sensível.

    
por 10.07.2010 / 21:29
1

Do seu lado, acredito que você possa estar interessado em uma solução usando o GNU Parallel http: //www.gnu.org/software/parallel/

find /target/directory -type f | parallel perl -pi -e 's/stringtoreplace/replacement/ig'

Esta solução faz a substituição em paralelo e não faz distinção entre maiúsculas e minúsculas. O GNU Parallel não sofre com o problema do separador http: //en.wikipedia.org/wiki/Xargs#The_separator_problem - somente se você tiver nomes de arquivos contendo novas linhas, precisará da combinação -print0 / -0.

Assista ao vídeo de introdução do GNU Parallel: link

    
por 15.07.2010 / 00:10