グローバル検索+置換(テストが通過した場合のみ)

グローバル検索+置換(テストが通過した場合のみ)

グローバル検索を実行し、ファイルディレクトリを変更したいと思います。これにはいくつかの方法がありますが(多くの編集者、sed + find)、追加の要件があります。可能な置換ごとにシェルスクリプトを実行し、スクリプトが合格した場合にのみ変更を保持したいと思います。

たとえば、私がRustコードで「pub」を使いすぎることに決めて、私のコードを「あまり公開していない」としたいとしましょう。

以下を実行できます。sed -e 's/pub//g' -i $(find . -name "*.rs")すべての項目を削除するには実行する必要がありますが、その一部は必須であるため、一度に1つずつsを削除して各項目の後に実行pubしようとします。pubcargo check

ベストアンサー1

説明は、単一の交換をテストし、それを維持またはロールバックする必要があることを示しています。したがって、その場所で修正してテストした後、失敗した場合はバックアップファイルを復元し、成功した場合は何もしないことがあります。

また、拒否された同じ変更を再テストしないように何が起こったのかを追跡する必要があります。パターンが1行に1回発生する可能性があると仮定すると、ファイルに次のようなものを使用できます。

line_numbers=( $(sed -n '/pub/=' "$1") )

for i in "${line_numbers[@]}"; do
    sed -i.old "${i}s/pub//" "$1" && run_test || mv "$1.old" "$1"
done

各ケースを一度テストするために発生した行番号のみを保存します。最初のものは行番号の取得とsed似ています。grep -n一致するものがない場合、次のループはゼロ回実行されます。 2番目は、sed特定の行番号のみを変更することです$i。二重引用符は、変数をsed式に拡張するために使用されます。

ファイルに対して実行します。

find . -type f -name '*.rs' -exec sh script.sh {} \;

また、すべてのバックアップファイルをクリーンアップ*.oldし、ターゲットディレクトリにないバックアップ拡張子を選択する必要があります。

ファイル構造、パターンの頻度、run_test実際に実行されている項目によっては、多くのプロセスが呼び出されるため、速度が遅くなる可能性があります。また、常に実行する前に、データが正しくバックアップされていることを確認してください。

おすすめ記事