查找-exec上的多个sed操作

时间:2012-08-16 10:40:20

标签: regex linux sed

我正在尝试对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 个答案:

答案 0 :(得分:3)

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

实现所需结果的最简单方法是将所有结果合并为一个带有分号的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' "{}" \;

答案 1 :(得分:0)

shell将解释&& s。引用它们以阻止此'&&'

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

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

答案 2 :(得分: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 更好,就像接受的答案一样)

答案 3 :(得分:-1)

你的shell可能会将此命令拆分为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

中的单个命令调用的外部sed脚本