Usando chaves vazias {} dentro do comando sed do find -exec

4

Gostaria de saber se é possível incluir chaves vazias {} dentro de uma substituição sed de um find -exec .

Um exemplo:

find "$dir" -type f -name "*" -exec sed -i s/hello{}a/hello{}b/g '{}' +

Isso traz a mensagem de erro de {} :

duplicada

find: Only one instance of {} is supported with -exec ... +

Existe uma maneira de manter {} no comando sed e ser visto como literais, não como substitutos dos arquivos que find encontra?

    
por mrbnnny 26.02.2016 / 03:24

2 respostas

4

Nesse caso, você pode contornar a gramática exec do find capturando uma expressão de chave e usando uma referência de retorno no texto de substituição:

$ cat f1 f2
f1: hello{}a
f2: hello{}a
$ find . -type f -exec sed -i 's/hello\([{][}]\)a/hellob/g' '{}' +
$ cat f1 f2
f1: hello{}b
f2: hello{}b

Ou, mais simplesmente (como observado nos comentários):

find "$dir" -type f -exec sed -i 's/\(hello[{]}\)a/b/g' {} +

Observe que a opção -i para Sed não é portátil e não funcionará em todos os lugares. O comando dado funcionará apenas no GNU Sed.

Para detalhes, consulte:

por 26.02.2016 / 03:59
0

Por um lado, você está usando + , o que significa que -exec pode colocar vários argumentos no lugar de {} . Não é possível que isso seja o que você pretendia quando combinado com o comando sed , e é possível (embora muito dependente da implementação) que você possa obter o resultado desejado simplesmente removendo o + .

No entanto, a maneira geral de fazer isso é usando sh -c :

find "$dir" -type f -exec sh -c 'sed -i "s/hello$1a/hello$1b/g" "$1"' sh {} \;
    
por 26.02.2016 / 03:32

Tags