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

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

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

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

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

Posso fazer isso VIMcom o comando:

:%s/nullptr/NULL/g 

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

Responder1

for file in /path/to/dir/*; do
  sed -i s/nullptr/NULL/g "$file"
done

No entanto, isso não afeta os subdiretórios.

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 1se isso não for desejado.

Responder2

Duas maneiras de fazer isso:

vim

Você pode usar o vim na linha de comando assim:

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

Enrole em um loop for:

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

Perl

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

Enrole em um loop for:

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

Ou simplesmente:

$ perl -p -i -e 's/nullptr/NULL/g' -- *

Responder3

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 acontece com o sed -i, lembre-se de que ele pode quebrar links (hard e soft), alterar a propriedade e a permissão dos arquivos e alterar a dispersão e outros atributos potencialmente incomuns dos arquivos. Tenha também em atenção que as versões do GNU grepanteriores 2.12seguem links simbólicos ao descer na árvore de diretórios com -r.

informação relacionada