繰り返される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が投稿したリンクのおかげで、実際に「1行」を実行するようにスクリプトを編集しました。以下に投稿しました。コメントをいただいたコメントの作成者のおかげで問題が解決しました。

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

ベストアンサー1

sedこれら2つのコマンドがそれぞれ実行されるため、出力は期待どおりです。変更されていない同じ入力テキストについて。クエリーが期待する出力を得るには、2つのs代替コマンドを単一の呼び出しに結合する必要があります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' "{}" \;

おすすめ記事