2017-02-16 96 views
0

我很想grep 下面的确切单词,并从当前目录中递归替换它们。在一行中替换特定的字

条件

  • plan => service_plan
  • Plan => ServicePlan

而且,如果他们生活在一个句子的中间,它也必须更换。

  • abc_plan => abc_service_plan
  • AbcPlan => AbcServicePlan

除了这两个词。

  • Stripe::Plan X
  • X

我试图

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

但我不知道我怎么可以排除的,包括一些更多的话。

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

+0

有什么你试过这么远吗?你尝试过和失败的任何方向?写下你的代码 –

+0

*有些单词*表示一些确切的单词。你可以展示他们吗? – RomanPerekhrest

+0

是的一些确切workds – Tosh

回答

1

您的搜索模式需要使用否定的lookbehind正则表达式。不幸的是标准shell实用程序sed,awk不支持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

+0

谢谢!顺便说一下,lookbehind正则表达式是什么? – Tosh

+0

'(?<!stripe_)'部分声明我们在'plan'之前不能有'stripe_'文本。 – anubhava