0

find-exec操作で複数のsed操作を実行しようとしています。私のコードは次のようになります:

find . -name '*.html.haml' -exec sed -i '' 's/restaurant_id/company_id/g' && sed -i '' 's/restaurants/companies/g' && sed -i '' 's/restaurant/company/g' && sed -i '' 's/Restaurants/Companies/g' && sed -i '' 's/Restaurant/Company/g' "{}" \;

これはうまくいかないようです。どうすればそれができますか?

エラー:

find: -exec: no terminating ";" or "+"
4

4 に答える 4

3

他の人が言っているように、問題は、各ファイルで実行されるコマンドの1つの文字列を渡すのではなく、コマンドの終了&&にsedコマンドを実行するためにインタプリタされることです。find

目的の結果を得る最も簡単な方法は、これをすべてsedセミコロン付きの1つのコマンドに結合することです。そのようです:

$ find . -name '*.html.haml' -exec sed -i 's/restaurant_id/company_id/g;s/restaurants/companies/g;s/restaurant/company/g;s/Restaurants/Companies/g;s/Restaurant/Company/g' "{}" \;
于 2012-08-16T10:49:32.927 に答える
0

sは&&シェルによって解釈されます。これを防ぐためにそれらすべてを引用してください'&&'

"{}"各sedコマンドに追加する必要があります。

または、sedのオプションを使用して-e、複数のスクリプトでsedを1回だけ実行することもできます。

于 2012-08-16T10:45:34.383 に答える
0

ecex次のように、複数のを設定することもできます。

find . -name '*.html.haml' \
-exec sed -i '' 's/restaurant_id/company_id/g' "{}" \; \
-exec sed -i '' 's/restaurants/companies/g' "{}" \; \
-exec sed -i '' 's/restaurant/company/g' "{}" \; \
-exec sed -i '' 's/Restaurants/Companies/g' "{}" \; \
-exec sed -i '' 's/Restaurant/Company/g' "{}" \;

sed(ただし、この特定のケースでは、受け入れられた回答のように、単一の方が優れています)

于 2021-04-11T08:08:06.090 に答える
-1

シェルはおそらくこのコマンドをfind . -name '*.html.haml' -exec sed -i '' 's/restaurant_id/company_id/g'&&に分割しますsed -i ...

execコマンドを引用してみてくださいfind . -name '*.html.haml' -exec "sed -i '' 's/restaurant_id/company_id/g' && sed -i ..."

別のアプローチは、execからの単一のコマンドで呼び出すことができるexternsed-scriptです。

于 2012-08-16T10:45:19.950 に答える