特定のファイル拡張子の文字列の検索と置換

特定のファイル拡張子の文字列の検索と置換

私はこの乱交を持っています:

  replace="s/AAAA/BBBB/g";
  find myDirectory/. -type f -print0 | xargs -0 sed -i $replace;

これはツリーを再帰的にスキャンし、その中のすべてのファイルをmyDirectory置き換えます。AAAABBBB

しかし、特定の拡張子を持つファイルでのみこれが発生するように制限したいと思います.txt.read.po

この制限をどのように課しますか?

答え1

-name検索オプションを使用して、ファイル名に基づいて一致を制限できます。

find myDirectory/. -type f -name '*.txt' -print0 | xargs -0 sed -i "$replace"

複数の拡張機能の場合-o(または)を使用してグループ化できます()

find myDirectory/. -type f \( -name '*.txt' -o -name '*.read' \) -print0 | xargs -0 sed -i "$replace"

-exec代わりに使用できるもう1つの改善点は、xargs移植性に優れ、サブシェルを削除することです。

find myDirectory/. -type f -name '*.txt' -exec sed -i "$replace" {} +

答え2

次の設定を次の項目に追加します.bashrc

shopt -s extglob globstar

extglobもう少し開いてください。模様@(…)取り外し可能な構造を含みます。再帰ディレクトリナビゲーションをglobstar有効にします。**/

これにより、以下を使用する必要はありませんfind

sed -i "$replace" mydirectory/**/*.@(txt|read|po)

zshでは特別なオプションは必要ありません。ただ実行してください。

sed -i $replace mydirectory/**/*.(txt|read|po)

ファイルが多い場合は、「コマンドラインの長さ制限を超えました」などのメッセージが表示されることがあります。しかし、最新のLinuxシステムの制限は非常に高く、これらの制限が発生する可能性はほとんどありません。

答え3

私はこれをうまく試しました - DBAの存在をAOSに置き換えます

sed -i -E "s/DBA/AOS/g" *.sh

関連情報