Ajuda com uma instrução sed em loop - saída estranha

2

Eu pensei que sabia o meu caminho para um loop for usando sed, acho que não!

Eu escrevi um pequeno script que irá recursivamente passar por todos os arquivos * .py dentro de um diretório e substituir entradas específicas nos arquivos.

Portanto, os arquivos e seu conteúdo atual:

find . -name "*.py" -exec ls "{}" \; -exec cat "{}" \;

e isso retorna isso:

./1/File1.py
import sys

./2/3/File3.py
import sys
sys.exit(1)

./6/7/File7.py
import sys
sys.exit()

./File0.py
import sys

Agora, o script que escrevi é o seguinte:

for file in $(find . -name "*.py")
do
    echo "$file"
    sed 's/sys.exit.*/os_.exit()/g;s/import sys/&\nimport os/g' "$file"
done

Agora, se eu executasse esses comandos sed por conta própria, obteria minha saída desejada. Se eu executar os dois juntos dentro do meu script, ou assim:

find . -name "*.py" -exec sed 's/sys.exit.*/os_.exit()/g' "{}" \; -exec sed 's/import sys/&\nimport os/g' "{}" \;

acabaria duplicando minha saída assim:

./1/File1.py
import sys
import sys
import os

./2/3/File3.py
import sys
os_.exit()
import sys
import os
sys.exit(1)

./6/7/File7.py
import sys
os_.exit()
import sys
import os
sys.exit()

./File0.py
import sys
import sys
import os

Alguém pode apontar o que estou fazendo errado?

EDIT: graças ao link postado por don_crissti, eu editei o script para realmente executar um 'one-liner'. Eu postei isso abaixo, graças à opinião de todos que comentaram que resolveu meu problema.

find . -name "*.py" -exec ls "{}" \; -exec sed 's/sys.exit.*/os_.exit()/g;s/import sys/&\nimport os/g' "{}" \;
    
por 64Hz 11.05.2018 / 11:45

1 resposta

1

A saída é como deveria ser esperada, porque cada um dos dois comandos sed opera no mesmo texto de entrada não modificado . Para obter a saída que o investigador esperava, os dois comandos s ubstitute devem ser combinados em uma chamada de sed :

... -exec sed -e 's/sys.exit.*/os_.exit()/g' -e 's/import sys/&\nimport os/g' "{}" \;

ou

... -exec sed 's/sys.exit.*/os_.exit()/g;s/import sys/&\nimport os/g' "{}" \;

    
por 11.05.2018 / 14:15