特定の拡張子を持つファイルのシェルスクリプトでsedを使用する

特定の拡張子を持つファイルのシェルスクリプトでsedを使用する

sedを使用して特定の拡張子を持つファイルを見つけて、特定の文字列を別の文字列に置き換えようとします。

No directory mentioned using current directory
*.h
sed: can't read *.h: No such file or directory
*.C
sed: can't read *.C: No such file or directory
*.cc
sed: can't read *.cc: No such file or directory
un.cpp

私のスクリプトのコードは次のとおりです。

for file in *.{h,C,cc,cpp}
       do
          echo $file;
          sed -i -e 's/${1}/${2}/g' $file;
       done

サブフォルダでsedを再帰的に使用するためにfindを使用しようとしたときに同様の問題が発生しました。

find ./*.{h,C,cc,cpp} -type f -exec sed -i -e 's/${2}/${3}/g' {} \;

ありがとう

ベストアンサー1

find . -type f -a \( -name "*.h" -o -name "*.C" -o -name "*.cc" -o -name "*.cpp" \) -a -exec sed -i -e "s/${2}/${3}/g" {} +

動作する必要があります。

最初のスクリプトで問題は、一致するものがなければ、*.hbashがリテラル*.hをsedに渡し、sedがファイル名だと思いますが、そのようなファイルがないため失敗します。

2番目のケースでは、を使用してfind(1)シェルが現在のディレクトリで一致するファイル名を見つけ、それをfind(1)に渡します。

sedステートメントでシェルが引用された文字列で変数拡張を実行するには、単一引用符の代わりに二重引用符が必要です。

おすすめ記事