find & sed (procurar e substituir)

18

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 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 .
    
por Amir Afghani 18.04.2012 / 20:59

1 resposta

23

Antes de tudo, verifique se você está usando cotações ascii regulares, como " e ' (códigos ascii 0x22 e 0x27 , respectivamente) em scripts de shell, porque o exemplo em sua postagem contém não caracteres de cotação padrão. Se você olhar de perto, eles parecem um pouco diferentes. Muito provavelmente, este é um erro de copiar e colar de um formato de documento rich text como Word, OOWriter ou até mesmo uma janela do navegador.

Já que você está em um Mac, você provavelmente tem a implementação do FreeBSD de sed , nesse caso você tem 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 invocação de sed por arquivo).

Na implementação do FreeBSD de sed o -i flag precisa de um argumento: a extensão de um arquivo de backup. Por exemplo, com -i .bak , o comando faria o backup de file1.txt como file1.txt.bak antes de executar a substituição no arquivo original. Usando um argumento vazio '' significa não usar um arquivo de backup, que parece ser o que você deseja.

A mesma coisa na implementação do GNU (ou NetBSD, OpenBSD, busybox) seria:

find . -name "*.java" -exec sed -i s/foo/bar/g {} +

Obrigado @bahamat e @ Mikel e @pieter-breed para melhorar minha resposta com seus comentários.

    
por 18.04.2012 / 22:57

Tags