find & sed (pesquisar e substituir)

find & sed (pesquisar e substituir)

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 contendo 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 .

Responder1

Primeiro de tudo, certifique-se de usar aspas ascii regulares como "e '(códigos ascii 0x22e 0x27, respectivamente) em scripts de shell, porque o exemplo em sua postagem contém caracteres de aspas nã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.

Como você está em um Mac, provavelmente possui a implementação do FreeBSD sed, e nesse caso você deve escrever o comando desta forma:

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

(aqui usando +em vez de \;evitar a execução de uma sedinvocação por arquivo).

Observe que essas aspas "s/foo/bar/g"são necessárias se foohouver barespaços.

Na implementação do FreeBSD sedo -iflag precisa de um argumento: a extensão de um arquivo de backup. Por exemplo, com -i .bako comando faria backup file1.txtcomo file1.txt.bakprimeiro antes de realizar a substituição no arquivo original. Usar um argumento vazio ''significa não usar um arquivo de backup, que parece ser o que você deseja.

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

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

Obrigado@bahamate@Mikele@pieter-raçapor melhorar minha resposta com seus comentários.

informação relacionada