2017-02-16 48 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