O problema com o seu código é duplo:
-
O comando
grep, por padrão, espera um padrão de expressão regular, não uma sequência, e sua sequência contém caracteres especiais para expressões regulares ([e]). Você tem o mesmo problema em sua substituiçãosed. -
Os nomes dos arquivos gerados por
grep -lpodem ser desconfigurados. Se um arquivo contiver um caractere não imprimível (como newline),grepsimplesmente o soltará do nome gerado. Isso significa quesednão será invocado nesse arquivo.
Isto supõe que você gostaria de substituir a string no conteúdo do arquivo, não em nomes de arquivo:
Para localizar todos os arquivos abaixo do diretório /mnt/d/power/jan/output que contém a string exata Aux Power [A] , use
find /mnt/d/power/jan/output -type f \
-exec grep -Fq 'Aux Power [A]' {} ';' -print
Para alterar a string para aux_power , você estenderia esse comando da seguinte forma:
find /mnt/d/power/jan/output -type f \
-exec grep -Fq 'Aux Power [A]' {} ';' \
-exec sed -i 's/Aux Power \[A\]/aux_power/g' {} ';'
Isto está assumindo o GNU sed .
O grep -Fq não produzirá nenhuma saída, mas retornará um status de saída zero para qualquer arquivo que contenha a sequência especificada (não a expressão regular, pois -F é usado).
O comando sed faz a edição no local (a maneira GNU), alterando todas as ocorrências da string (aqui especificada como uma expressão regular, e é por isso que os colchetes são escapados).
Se você deseja obter os nomes dos arquivos modificados listados no terminal, deixe o -print in do primeiro comando find , após o -exec grep ... {} ';' .
Como a expressão sed que estamos usando aqui não alterará o conteúdo de um arquivo que não contenha a string específica que você deseja alterar, você poderá encurtar o comando para
find /mnt/d/power/jan/output -type f \
-exec sed -i 's/Aux Power \[A\]/aux_power/g' {} ';'
Isso aplica a substituição a arquivos todos no diretório /mnt/d/power/jan/output . Qualquer arquivo que não contenha a string permanecerá inalterado (mas seu timestamp ainda será atualizado).