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

  • É exatamente isso que você ' re em execução? E se você remover o -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.)
  • Na verdade, isso resolve o problema, pelo menos para mim. Aspas duplas e simples devem ser substituídas por " e ', respectivamente.
  • Sm citações de arte (?)! .. 🙂
  • O que colei foi exatamente o que estava executando. Alguém pode postar uma resposta?
  • Na próxima vez, poste a mensagem de erro que você está vendo ao fazer a pergunta. Isso vai economizar tempo para todos.

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.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *