Estou usando o seguinte comando no meu mac:
$find . -name “*.java” -exec sed -i ’s/foo/bar/g’ {} \;
e parece não ter efeito.
Tenho dois arquivos no diretório que terminam em .java, os quais têm o foo texto neles. Estou faltando alguma coisa?
EDITAR: 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 .
Comentários
Resposta
Em primeiro lugar, certifique-se de estar usando ascii regular citações como "
e "
(códigos ascii 0x22
e 0x27
, respectivamente) em scripts de shell, porque o exemplo em sua postagem contém caracteres de aspas fora do padrão. Se você observar atentamente, eles parecem um pouco diferentes. Muito provavelmente, este é um erro de copiar e colar de um documento rich text formato como Word, OOWriter ou até mesmo uma janela de navegador.
Como você está em um Mac, provavelmente tem a implementação do FreeBSD de sed
, na qual caso você tenha que escrever o comando desta forma:
find . -name "*.java" -exec sed -i "" s/foo/bar/g {} +
(aqui usando +
em vez de \;
para evitar a execução de uma sed
invocação por arquivo).
Na implementação do FreeBSD de sed
o sinalizador precisa de um argumento: a extensão de um arquivo de backup. Por exemplo, com -i .bak
o comando faria backup file1.txt
como file1.txt.bak
antes de realizar a substituição em o arquivo original. Usar um argumento vazio ""
significa não usar um arquivo de backup, que parece ser o que você quer.
A mesma coisa no GNU (ou NetBSD, OpenBSD , busybox) a implementação seria:
find . -name "*.java" -exec sed -i s/foo/bar/g {} +
Obrigado @bahamat e @Mikel e @ pieter-breed por melhorar minha resposta com seus comentários.
Comentários
- O que as chaves fazem?
- @ZaneHitchcox as chaves são espaços reservados para o nome de arquivo correspondente
- o que ' so
+
faz no final? - @Anthony the
+
no final termina a lista de argumentos da opção-exec
. É exigido pela sintaxe de-exec
.
-exec
e tudo o que vem depois dele? Ele imprime os nomes dos arquivos Java? (Eu ' estou preocupado que você ' está usando aspas em vez de aspas ASCII.)"
e'
, respectivamente.