Este não é exatamente um problema de sintaxe sed , é um problema de sintaxe find .
O {} é um contêiner que substituirá o nome do arquivo que está sendo processado pelo comando sed .
Se você usa find assim:
$ find . -type f -name *.py -exec head {} \;
Isso localizará scripts Python e mostrará a cabeça de cada arquivo. Se você tiver três scripts no diretório atual:
- 1.py
- 2.py
- 3.py
O {} conterá cada nome de arquivo e executará o comando head em cada arquivo.
O argumento -exec precisa de ; no final para poder reconhecer o final dos argumentos do comando ( sed neste caso), mas, para proteger ; da expansão, é necessário escapar dele com o \ .
Lembre-se de que você pode executar vários comandos por vez se usar o ; :
$ ls; pwd;
Isso listará os diretórios ( ls ) e imprimirá seu diretório de trabalho ( pwd ). O argumento -exec também precisa de ; . Mas como você não quer confundir o ; que separa comandos com o ; que faz parte do argumento -exec de find , você precisa escapar com o \ .
Como alternativa, você pode usar aspas em torno do ; :
$ find /home/bruno/old-friends -type f -exec sed -i 's/ugly/beautiful/g' {} ";"
Espero ter deixado claro