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 -l
podem ser desconfigurados. Se um arquivo contiver um caractere não imprimível (como newline),grep
simplesmente o soltará do nome gerado. Isso significa quesed
nã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).