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' "{}" \;