2017-02-16 5 views
0

Мне очень понравится grep точные слова ниже и заменить их рекурсивно из текущего каталога.замените конкретное слово в одной строке

УСЛОВИЯ

  • plan => service_plan
  • Plan => ServicePlan

Кроме того, если они живут в середине предложения, он также должен быть заменен.

  • abc_plan => abc_service_plan
  • AbcPlan => AbcServicePlan

За исключением этих двух слов.

  • Stripe::Plan х
  • х

Я попытался

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

Но я не знаю, как я мог бы исключить и включить еще несколько слов.

Было бы очень полезно, если вы добавите объяснения для некоторой опции конкретной команды!

+0

Что бы вы пытались сделать до сих пор? В любом направлении, которое вы пробовали и не смогли? Напишите свой код –

+0

* несколько слов * означает некоторые точные слова. Можете ли вы показать им? – RomanPerekhrest

+0

да некоторые точные работы – Tosh

ответ

1

Ваш шаблон поиска требует использования отрицательного регулярного выражения lookbehind. К сожалению, стандартные утилиты оболочки, например. sed, awk не поддерживают регулярное выражение lookbehind. Я предлагаю использовать perl с find (для рекурсивного поиска):

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

Спасибо! Кстати, что такое regex lookbehind? – Tosh

+0

'(? anubhava

Смежные вопросы