Substituir string por espaços no diretório inteiro

0

Eu quero substituir 'Aux Power [A]' em todos os arquivos para 'aux_power'. Apenas os arquivos com 'Aux Power [A]' podem ser modificados, o resto precisa permanecer intocado.

Eu tentei

grep -lR "Aux Power [A]" /mnt/d/power/jan/output | xargs sed -i "s/'Aux Power [A]'/'aux_power_w'/g"

mas parece que não funciona.

Por favor, conselhos.

    
por Umer 17.02.2018 / 11:51

2 respostas

2

O problema com o seu código é duplo:

  1. 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ção sed .

  2. 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 que sed 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).

    
por 17.02.2018 / 12:23
1

Você deve escapar dos colchetes para grep. "[A]" é o mesmo que "A". Experimente

grep -lR "Aux Power \[A\]" /mnt/d/power/jan/output | xargs sed -i "s/Aux Power \[A\]/aux_power_w/g"
    
por 17.02.2018 / 12:00