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

正如其他人所说,问题在于在命令完成&&执行 sed 命令,而不是传递要在每个文件上执行的一串命令。find

实现所需结果的最简单方法是将所有这些组合成一个sed带有分号的命令。像这样:

$ 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 将由 shell 解释。引用它们以防止这种情况'&&'

您需要添加"{}"到每个 sed 命令。

或者,您可以使用-esed 选项仅使用多个脚本执行一次 sed。

于 2012-08-16T10:45:34.383 回答
0

也可以有多个ecexs,例如:

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 ..."

另一种方法是外部 sed 脚本,您可以使用来自 exec 的单个命令调用

于 2012-08-16T10:45:19.950 回答