Estou usando o seguinte comando no meu mac:
$find . -name “*.java” -exec sed -i ’s/foo/bar/g’ {} \;
e parece não ter efeito.
Eu tenho dois arquivos no diretório que terminam em .java, ambos com o texto foo. Estou esquecendo de algo?
EDIT: Resultados da solicitação de comentários
[aafghani-03:~/test amirafghani]$ find . -name "*.java" -exec sed -i 's/foo/bar/g' {} \;
sed: 1: "./bar.java": invalid command code .
sed: 1: "./foo.java": invalid command code .
-exec
e tudo depois dele? Ele imprime os nomes dos arquivos Java? (Eu estou preocupado que você está usando aspas inteligentes em vez de aspas ASCII.)"
e'
, respectivamente.Respostas:
Antes de tudo, verifique se você está usando aspas ASCII regulares como
"
e'
(códigos ASCII0x22
e0x27
, respectivamente) em scripts de shell, porque o exemplo na sua postagem contém caracteres de aspas não padrão. Se você olhar de perto, eles parecerão um pouco diferentes. Provavelmente, esse é um erro de copiar e colar de um formato de documento rich text como Word, OOWriter ou até mesmo uma janela do navegador.Como você está em um Mac, provavelmente possui a implementação do FreeBSD
sed
, nesse caso você deve escrever o comando desta maneira:(aqui usando em
+
vez de\;
para evitar a execução de umased
chamada por arquivo).Na implementação do FreeBSD,
sed
a-i
flag precisa de um argumento: a extensão de um arquivo de backup. Por exemplo, com-i .bak
o comando faria um backupfile1.txt
comofile1.txt.bak
primeiro antes de realizar a substituição do arquivo original. Usar um argumento vazio''
significa não usar um arquivo de backup, que parece ser o que você deseja.O mesmo na implementação do GNU (ou NetBSD, OpenBSD, busybox) seria:
Obrigado @bahamat e @Mikel e @ pieter-breed por melhorar minha resposta com seus comentários.
fonte