替换一行中的特定单词

时间:2017-02-16 10:33:14

标签: shell replace grep

我喜欢grey 下面的确切字词,并从当前目录中递归替换它们。

条件

  • plan => service_plan
  • Plan => ServicePlan

如果他们住在句子的中间,也必须更换。

  • abc_plan => abc_service_plan
  • AbcPlan => AbcServicePlan

除了这两个词。

  • Stripe::Plan x
  • stripe_plan x

我试过

grep -l 'plan' ./* | xargs sed -i.bak -e 's/plan/service_plan/g'

但我不确定如何排除并包含更多单词。

如果您为特定命令的某些选项添加解释,我们将非常感激!

1 个答案:

答案 0 :(得分:1)

您的搜索模式需要使用负面的lookbehind正则表达式。不幸的是标准shell实用程序。 sedawk不支持lookbehind正则表达式。我建议将perlfind一起使用(用于递归搜索):

find . -type f -exec \
perl -i -pe 's/(?<!stripe_)plan/service_$&/g; s/(?<!Stripe::)Plan/Service$&/g' {} +

Details on lookahead and lookbehind in regex