Substitui todas as ocorrências de um termo nos arquivos contidos em uma pasta

5

Em uma pasta no meu sistema, tenho um projeto C++ que estou tentando compilar.

Este processo usa alguns idiomas C++ que não são suportados pela minha versão do compilador. Em particular, muitas vezes dentro do código é usado o valor de dados 'nullptr' .

O que eu quero fazer é substituir todas as ocorrências de nullptr por NULL .

Eu posso fazer isso em VIM com o comando:

:%s/nullptr/NULL/g 

Como posso fazer isso para todos os arquivos em um diretório uma vez, sem abrir cada arquivo e executar o comando?

    
por Aslan986 26.04.2013 / 17:07

3 respostas

4

Duas maneiras de fazer isso:

vim

Você pode usar o vim na linha de comando da seguinte forma:

$ vim -c "%s/nullptr/NULL/g|wq" foo.txt

Quebra em um loop:

$ for i in *; do vim -c "%s/nullptr/NULL/g|wq" -- "$i"; done

Perl

$ perl -p -i -e 's/nullptr/NULL/g' foo.txt

Quebra em um loop:

$ for i in *; do perl -p -i -e 's/nullptr/NULL/g' -- "$i"; done

Ou simplesmente:

$ perl -p -i -e 's/nullptr/NULL/g' -- *
    
por 26.04.2013 / 17:16
6
for file in /path/to/dir/*; do
  sed -i s/nullptr/NULL/g "$file"
done

Isso não afeta subdiretórios, no entanto.

Editar 1

A solução mais rápida (com GNU):

find /path/to/dir -type f -print0 | xargs -0 sed -i s/nullptr/NULL/g

Isso afetaria subdiretórios (e dotfiles) também. Adicione -maxdepth 1 se isso não for desejado.

    
por 26.04.2013 / 17:16
3

Com ferramentas GNU:

grep -rlZ nullptr /path/to/dir |
  xargs -r0 sed -i s/nullptr/NULL/g

Para evitar ter que reescrever todos os arquivos.

Como sempre com sed -i , lembre-se de que ele pode quebrar links (hard e soft), alterar a propriedade e a permissão de arquivos e alterar a dispersão e, potencialmente, outros atributos incomuns de arquivos. Tenha também cuidado com as versões do GNU grep antes de 2.12 seguir links simbólicos ao descer a árvore de diretórios com -r .

    
por 26.04.2013 / 19:43