Отличные инструменты для поиска и замены в файлах?

Я перехожу из редактора PHP, специфичного для Windows, к VIM, по философии "использовать один редактор для всего и изучать его очень хорошо".

Тем не менее, одной из функций, которые мне нравились в моем редакторе PHP, была возможность "найти и заменить". Я мог бы приблизиться к двум путям:

  • Просто найдите. Найдите все файлы в проекте для строки, посмотрите все перечисленные вхождения и нажмите, чтобы погрузиться в этот файл в этой строке.
  • Слегка заменить все вхождения "foo" в "bar".

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

Я пытаюсь аппроксимировать эту способность сейчас, и попытка собрать ее вместе с bash довольно утомительна. Достойная, но утомительная.

Кто-нибудь знает какие-нибудь отличные инструменты для таких вещей, как Linux и/или Windows? (Я бы предпочел, если возможно, графический интерфейс.) Или, если это не так, bash script, который хорошо выполняет эту работу? (Если он будет перечислять имена файлов и номера строк и показывать фрагменты кода, это будет здорово.)

Ответ 1

Vim имеет встроенный поиск нескольких файлов, используя команду :vimgrep (или :grep для использования внешней программы grep - это единственный вариант до Vim 7).

:vimgrep будет искать файлы для регулярного выражения и загружать список совпадений в буфер - вы можете либо визуально просмотреть список результатов в буфере, либо с помощью команд :cnext и :cprev. Он также поддерживает поиск по дереву каталогов с помощью шаблона **. например

:vimgrep "^Foo.*Bar" **/*.txt

для поиска строк, начинающихся с Foo и содержащих Bar в любом .txt файле в текущем каталоге.

:vimgrep использует буфер "quickfix" для хранения своих результатов. Существует также :lvimgrep, который использует локальный буфер, специфичный для используемого вами окна.

Vim не поддерживает замену нескольких файлов из коробки, но есть плагины, которые тоже будут делать это на vim.org.

Ответ 2

Попробуйте sed. Например:

sed -i -e 's/foo/bar/g' myfile.txt

Ответ 3

Я не понимаю, почему вы не можете сделать это с помощью VIM.

Просто найдите

/Foo

Показывает все экземпляры Foo в файле, и вы можете делать то, что хотите.

Слепо заменить

:% s/Foo/Bar/g

Очевидно, это только верхушка айсберга. У вас много гибкости в области поиска и полной поддержки регулярных выражений для вашего термина. Он может работать не так, как ваш прежний редактор, но я думаю, что ваша оригинальная идея "использовать один редактор" является действительной.

Ответ 4

Блокнот ++ позволяет мне искать и заменять всю папку (и подпапки) с поддержкой регулярных выражений.

Ответ 5

Вы можете использовать perl в командной строке для замены текста в файлах.

perl -p -i".backup" -e "s/foo/bar/g" test.txt

Ответ 6

Поскольку вы ищете инструмент GUI, я обычно использую следующие два инструмента. Оба они имеют отличную функциональность, включая сопоставление wildcat, regex, filetype filter и т.д. Оба они отображают хорошую полезную информацию о попадании в такие файлы, как filename/lines.

  • Visual Studio: быстрый, но мощный. Я использую его, если номер файла огромен (скажем, десятки тысяч...)

  • pspad: легкий. И хорошая особенность find/replace для pspad заключается в том, что он будет организовывать хиты в разных файлах в иерархии деревьев, что очень ясно.

Ответ 7

Существует ряд инструментов, которые вы можете использовать, чтобы упростить работу. Во-первых, для поиска всех файлов в проекте из vim вы можете использовать :grep так:

:grep 'Function1' myproject/

Это, по существу, запускает grep и позволяет вам быстро перейти из/в места, где он был найден.

Ctags - это инструмент, который находит объявления в вашем коде, а затем позволяет vim перейти к этим объявлениям. Для этого запустите ctags, а затем поместите курсор над вызовом функции, а затем используйте Ctrl-]. Вот ссылка с еще одной информацией ctags:

http://www.davedevelopment.co.uk/2006/03/13/vim-ctags-and-php-5/

Ответ 8

Я не знаю, если это вариант для вас, но если вы загрузите все свои файлы в vim с помощью vim *.php чем вы можете

:set hidden

:argdo %s/foo/bar/g = > выполнит команду substitue во всех открытых буферах

:wall = > будет записывать все открытые буферы

Или вместо загрузки всех ваших файлов в vim попробуйте :help vimgrep и cominbation :help argdo и :help argadd

Ответ 9

Для Windows я считаю, что grepWin трудно побить - графический интерфейс для мощного и гибкого инструмента grep для Windows. Он ищет и заменяет, знает о регулярных выражениях, такого рода вещи.

Ответ 10

Посмотрите на sed... мощный инструмент командной строки, который должен выполнить большую часть того, что вы ищете... его поддерживает регулярное выражение, поэтому ваш поиск/замена довольно прост. (мужчина)

Ответ 12

Команда grep -rn "search terms" * будет искать указанные термины во всех файлах (в том числе в подкаталогах) и будет возвращать соответствующие строки, включая имя файла и номер строки. Вооружившись этой информацией, легко перейти к конкретному файлу/строке в VIM.

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

Вы также можете запускать оба этих инструмента изнутри VIM.

Ответ 13

Некоторые разработчики, с которыми я сейчас работаю, ругаются Textpad. Он имеет пользовательский интерфейс, а также поддерживает использование регулярных выражений - все, что вы ищете, и многое другое.

Ответ 14

Полезный инструмент поиска очень ack. (Ubuntu ссылается на него как "ack-grep" в репозиториях и man-страницах.)

Короткий вариант того, что он делает, представляет собой комбинацию find и grep, более мощную и интеллектуальную, чем эта пара.