Помогите с зацикленным оператором sed – странный вывод

Я думал, что знаю, как обходить цикл с использованием sed, наверное нет!

Я написал небольшой скрипт, который рекурсивно просматривает все * .py файлы в каталоге и заменяет определенные записи в файлах.

Итак, файлы и их текущий контент:

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

и это возвращает это:

 ./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 

Теперь сценарий, который я написал, таков:

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

Теперь, если бы я запускал эти команды sed самостоятельно, я бы получил желаемый результат. Если я запускаю их вместе в своем скрипте, или вот так:

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

в конечном итоге это будет дублировать мой вывод следующим образом:

 ./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 

Может кто-то указать, что я делаю не так?

РЕДАКТИРОВАТЬ: благодаря ссылке, размещенной don_crissti, я отредактировал скрипт, чтобы фактически выполнить «одну строку». Я разместил это ниже, благодаря вкладу всех, кто прокомментировал, что это решило мою проблему.

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

Выходные данные соответствуют ожидаемым, поскольку каждая из двух команд sed работает с одним и тем же неизмененным входным текстом . Чтобы получить вывод, который ожидал запрашивающий, две команды sbstitute должны быть объединены в один вызов sed :

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

или же

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