Как сделать рекурсивный поиск и замену в проверке SVN? - PullRequest
5 голосов
/ 12 января 2011

Как мне найти и заменить каждое вхождение:

foo

с

bar

в каждом текстовом файле в дереве каталогов / my / test / dir / (рекурсивный поиск / замена).

НО я хочу сделать это безопасно в SVN checkout и ничего не трогать в каталогах .svn

Аналогично этому, но теперь с ограничением SVN: Awk / Sed: Как сделать рекурсивный поиск / замену строки?

Ответы [ 2 ]

10 голосов
/ 12 января 2011

Существует несколько возможностей:

Использование find:

Использование find для создания списка всех файлов, а затем передача их в sed или эквивалент, как указано в ответе, на который вы ссылаетесь, довольно прост и требует сканирования файлов один раз.

Вы бы использовали один из тех же ответов, что и в вопросе, на который вы ссылались, но добавив -path '*/.svn' -prune -o послеfind . для удаления каталогов SVN.См. в этом вопросе для обсуждения использования опции prune с find - хотя обратите внимание, что у них неправильный шаблон.Таким образом, чтобы распечатать все файлы, вы должны использовать:

find . -path '*/.svn' -prune -o -type f -print

Затем вы можете передать это в вызов xargs или что угодно, чтобы сделать отдельные замены, как предложено в вопросе, на который вы ссылались.Там много обсуждают различные варианты, которые я не буду здесь воспроизводить, хотя я предпочитаю версию из ответа Джона Цвинка :

find . -path '*/.svn' -prune -o -type f -exec sed -i 's/foo/bar/g' {} +

Использование рекурсивного grep:

Если у вас есть система с GNU grep, вы также можете использовать ее для поиска списка файлов.Это, вероятно, менее эффективно, чем find, но оно позволяет вам вызывать sed только для файлов, которые соответствуют, и я лично нахожу синтаксис намного легче запомнить (или выяснить из manpages):

sed -i 's/foo/bar/g' `grep -l -R --exclude-dir='*/.svn' 'foo' .`

Опция -l заставляет grep выводить только список имен файлов, а не соответствующие строки.

Использование редактора графического интерфейса пользователя:

Альтернативно,если вы используете windows, делайте то, что я делаю - получите копию редактора NoteTab (доступно в бесплатной версии) и используйте его команду search-and-replace-on-disk, которая автоматически игнорирует скрытые каталоги .svn ипросто работает.

Редактировать: Исправлен шаблон поиска в */.svn вместо .svn, добавлено больше деталей и некоторые другие возможности.Однако это зависит от вашей платформы и версии svn: в некоторых случаях может потребоваться .svn без */, например, в CentOS 7.

0 голосов
/ 12 января 2011

Как насчет этого?

grep -i "search_string" `find "*.some_extension"`

Это наполовину решение для поиска search_string в файлах с определенным расширением .... если вы знаете, что файлы имеют строку, ее можно легко изменить, отправив ее в sed ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...