
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 nullptr
por NULL
.
Posso fazer isso VIM
com 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 1
se 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 grep
anteriores 2.12
seguem links simbólicos ao descer na árvore de diretórios com -r
.