sed -i'' -e ... file
O BSD sed requer um argumento para -i
, ao contrário do GNU sed que aceita um argumento opcional para ele.
Página do man do FreeBSD sed :
-i extension
Edit files in-place similarly to -I
vs. Página man do GNU sed :
-i[SUFFIX], --in-place[=SUFFIX]
edit files in place (makes backup if SUFFIX supplied)
Observe os colchetes ou a falta deles.
Além disso, no shell -i''
é o mesmo que apenas -i
, as aspas em torno de uma string vazia são removidas.
Então, o que sed
acha que você está pedindo é criar um arquivo de backup com a extensão -e
e, a menos que tenha permissão de gravação para o diretório, você não poderá fazer isso. / p>
Mesmo sem um argumento ou com um argumento vazio para -i
, sed
provavelmente criará um arquivo temporário onde grava a saída resultante antes de movê-la para o nome original. Pelo menos o GNU sed cria o arquivo temporário no mesmo diretório que o original, então, novamente, você precisa ter permissão de escrita para esse diretório.
$ strace -etrace=open,rename sed -i -e '1d' foo
[...]
open("foo", O_RDONLY) = 3
open("./sedD9J9tV", O_RDWR|O_CREAT|O_EXCL, 0600) = 4
rename("./sedD9J9tV", "foo") = 0
Para contornar isso, você pode criar um arquivo temporário em outro lugar e depois mover seu conteúdo para o local:
$ sed -e '...' file > /tmp/file.tmp
$ cat /tmp/file.tmp > file && rm /tmp/file.tmp