sedを使用して別のフォルダ内のファイルの文字列を置き換える

sedを使用して別のフォルダ内のファイルの文字列を置き換える

別のフォルダにファイルがあります(ファイル拡張子.mvw)。各フォルダに移動して、「D3PLOT_1DForce」文字列(* .mvwファイルにあります)をフォルダ名に置き換えるスクリプトを作成したいと思います。

フォルダ構造は次のとおりです -

  • XYZ_DV_L02_P01
  • XYZ_DV_L02_P02
  • XYZ_DV_L02_P03

私は次のスクリプトを書いた -

#!/bin/sh
for ii in XYZ_DV_L02* ; do
(cd "$ii")
find . -iname "*.mvw" -type f -exec sed -i "s/D3PLOT_1DForce_EffPlStrainMax_VonMisesMax/"${ii}"/g" "{}" \;
done

動作し、文字列をフォルダ名に変更しますが、すべてのファイルの最初のフォルダ名を変更します。私はsedがforループに入るとは思わない。

sedがループで動作し、ファイル内の文字列をそのフォルダ名に置き換えるにはどうすればよいですか?

ベストアンサー1

このcdコマンドはサブシェルで実行されるため、実際には何もしません。したがって、findコマンドは、.txtの各サブディレクトリ名に対して一度だけ親ディレクトリで実行されますXYZ_DV_L02*。最初の呼び出しはsedすべてのファイルの文字列を変更し、その後の呼び出しはsed文字列を見つけることができませんが、とにかく実行されます。

この試み:

#!/bin/sh
for ii in XYZ_DV_L02* ; do
    find "$ii" -iname "*.mvw" -type f -exec sed -i "
      s/D3PLOT_1DForce_EffPlStrainMax_VonMisesMax/${ii}/g" "{}" +
done

編集してくれたStéphane Chazelasに感謝します。

質問のコマンドをコピーしてパスだけfindを変更しましたが、変更を説明する価値があります。

  • ${ii}以前は引用されていませんが、今では引数全体を囲む引用の一部ですsed
  • +代わりに、各ファイルに対して1つのコマンドではなく、複数のファイルに対して1つのコマンドが実行され\;ます。findsed

編集する

コメントリクエストでは、コレクション内のすべてのシーケンス[-_a-zA-Z0-9]と拡張子を含むファイル名である代替.h3dテキストが後に置き換えられます.mvw。これが私がコメントを理解する方法ですが、うまくいかないようです。パターンのテキストにアクセスするには、を使用できます\1。特定の要件に合わせてこのキットを調整する必要があるかもしれません。

#!/bin/sh
for ii in XYZ_DV_L02* ; do
    find "$ii" -iname "*.mvw" -type f -exec sed -i -r "
      s/([-_a-zA-Z0-9]+)\.h3d/${ii}.h3d/g" "{}" +
done

おすすめ記事