Как использовать find, -exec, grep и sed с регулярным выражением для замены части строки текста? - PullRequest
9 голосов
/ 24 ноября 2010

Ну, я действительно хотел создать фильтр для использования в DeltaWalker, чтобы игнорировать файлы только с определенной разницей в строках, чтобы я мог идентифицировать файлы с другими изменениями исходного кода.Гуру регулярных выражений Stackoverflow дали мне несколько хороших выражений, которые дают хорошие результаты поиска find -exec grep в OS X Terminal, но не влияют на результаты DeltaWalker.Итак, у меня есть другая идея.

Я вспоминаю утилиту с именем sed, с которой у меня нет опыта ... но, я думаю, ее можно вызвать с помощью ключа find -exec.Итак, у меня есть следующее, и мне интересно, знает ли кто-нибудь, как смешать sed для замены соответствующей строки текста: «Copyright (c) 2008 - 2009» на «Copyright (c) 2008 - 2010»

find . -exec grep -Hn '^.*Copyright (c) 2008 - 2009' {} \;

1 Ответ

13 голосов
/ 24 ноября 2010

Вы можете просто сделать это

find . -exec sed -r -e 's/(^.*)Copyright \(c\) 2008 - 2009/\1Copyright (c) 2008 - 2010/g' {} \;

Я предполагаю, что вы не хотите потерять то, что находится на линии до авторского права и соответствует .*

Но, в зависимости от вашего ввода, это может быть просто:

find . -exec sed -e 's/2009/2010/g' {} \;

Обратите внимание, что в обоих случаях я не изменяю файлы, просто показываю, как будут выглядеть результаты изменения содержимого.Я предполагаю, что в вашем реальном сценарии вы захотите записать изменения обратно на диск.Для этого вам нужен ключ -i для sed, таким образом:

find . -exec sed -r -i'' -e 's/(^.*)Copyright \(c\) 2008 - 2009/\1Copyright (c) 2008 - 2010/g' {} \;

Стоит отметить, что здесь я использую синтаксис GNU sed.У меня нет блока OS X, удобного для тестирования, но BSD sed обычно использует -E вместо -r для включения расширенного регулярного выражения.

...