Я не смог получить ответ Марио на работу, но если я использую xargs, он работает.
Кроме того, в большинстве случаев, когда я хочу выполнять поиск и замену в нескольких файлах, я хочу изменить буквенно-цифровой идентификаторот одного к другому, например, переименование переменной или класса и т. д. Для этого очень полезно добавить отрицательный взгляд назад и отрицательный взгляд вперед, чтобы запретить символы слова до или после того, что вы заменяете, и для этого grep требуетсяФлаг P для использования регулярного выражения Perl:
vim `find . -name '*.cpp' -o -name '*.hpp' | xargs grep -Ple '(?<!\w)FIND(?!\w)'`
:bufdo %s/FIND/REPLACE/gce
Конечно, полезно обернуть это в сценарий, чтобы вам не приходилось каждый раз вводить его заново.Вот начало:
#!/bin/bash
if [[ $# < 2 ]]; then
echo "Usage: search-replace <search> <replace>"
exit 1
fi
search="$1"
replace="$2"
files=`find . -name '*.cpp' -o -name '*.hpp' | xargs grep -Ple "(?<!\w)$search(?!\w)"`
if [[ -z "$files" ]]; then
echo "No matching .cpp or .hpp files."
exit 1
fi
# The stuff surrounding $search is the negative lookahead/lookbehind
vim -c "set hidden | bufdo %s/\(\w\)\@<!$search\(\w\)\@!/$replace/gce" $files
Что-то, что у меня все еще не работает изящно с решением Марио, заключается в том, что в конце первого файла написано:
Error detected while processing command line:
E37: No write since last change (add ! to override)
Это препятствует поиску изаменить из текущего файла.Похоже, что «set hidden» исправляет это, и поэтому я использовал это в своем вышеупомянутом скрипте.
Одна оставшаяся проблема заключается в том, что после выполнения поиска и замены в первом файле, кажется, обрабатывается этот первый файлво второй раз, отменяя ваши первоначальные замены.Если кто-нибудь знает, почему это происходит, дайте мне знать.