bash関数で `find -exec`を実行する方法---エスケープ文字の問題と予期しないファイルの終わり

bash関数で `find -exec`を実行する方法---エスケープ文字の問題と予期しないファイルの終わり

この種のコマンドをより簡単に実行したいと思います。

find . -type f -exec sed -i 's|wpp-splash|wpp_splash|g' {} \;

だからこれを短縮するために私の関数を作成しました.bashrc

function sedall() { find . -type f -exec sed -i 's|$1|g' {} \; }

だから私はそれを行うことができます

sedall wpp-splash|wpp_splash

しかし、構文エラーがあります。それが何であるかはわかりませんが、bash機能のために「予期しないファイルの終わり」が発生します。これが}キャラクターと関係があるかどうか疑問に思います。私は彼らから逃げようとしましたが、\{\}問題は解決されませんでした。

助けが必要ですか?

ベストアンサー1

そこには多くの問題があります。

  • 変数は一重引用符内では拡張されません。
  • { command ; }終了セミコロン(または改行文字)が必要です。
  • sedall wpp-splash|wpp_splashパイプ文字を引用符で保護しなかったため、これはパイプとして理解されます。

私はこれを提供する:

sedall(){
    [ "$#" = 2 ] || { echo Two arguments needed; return 9; }
    find . -type f -exec sed -i "s|$1|$2|g" {} \;
}

1つではなく2つの引数を取り、実行する前に両方の引数が指定されていることを確認してください。

$ cat a b
XABCX
YABCY
$ sedall ABC DEF
$ cat a b
XDEFX
YDEFY

おすすめ記事