O que há de errado com esta chamada para sed -i?

2

Eu tenho essa linha

find . -type f \( ! -name '*.plist' \) -and \( ! -name '*.mp4' \) -and \( ! -name '.DS*' \) -print0 | xargs -0 sed -i 's/AAA/BBB/g'

minha intenção é que a partir do diretório atual mude recursivamente todas as ocorrências de AAA para BBB em todos os arquivos, exceto aqueles com as seguintes extensões: .plist, .mp4 e .DS *

mas recebo a mensagem

sed: 1: "./myDir/pro ...": invalid command code .
    
por SpaceDog 07.01.2013 / 03:58

2 respostas

1

A solução mais fácil é usar isso:

find . -type f \( ! -name '*.plist' \) -and \( ! -name '*.mp4' \) -and \( ! -name '.DS*' \) -print0 | xargs -0 perl -pi -w -e  's/AAA/BBB/g'
    
por 07.01.2013 / 04:56
1

Ao contrário do GNU sed, o sed fornecido com o Mac OSX requer um argumento para a opção -i , especificando o sufixo de backup; para suprimir o backup você tem que passar uma string vazia ( '' ). Portanto, sed estava interpretando seu s/AAA/BBB/ como o sufixo de backup e assumindo o nome do seu primeiro arquivo ( ./myDir/pro ... ) como o comando a ser executado. Obviamente, . não é um comando sed válido, causando o erro. Tendo isso em mente, o seguinte funcionará:

find [...] | xargs -0 sed -i.bak 's/AAA/BBB/g'

Ou, se você insistir em suprimir o backup

find [...] | xargs -0 sed -i '' 's/AAA/BBB/g'
    
por 08.01.2013 / 01:12

Tags