Поиск Vim с использованием регулярного выражения

Я хочу найти строку, начинающуюся с "abc" и заканчивая "xyz" в vim.

Ниже приведены команды, которые я пробовал:

:1,$g/abc[\w\W]*xyz/
:1,$g/abc\[\\w\\W\]\*xyz/
:1,$g/abc*xyz/

"[\ w\W] *" означает, что тексты между "abc" и "xyz" могут быть любыми символами

"1, $" означает, что диапазон поиска находится от первой строки до последней строки в файле, открытом vim.

Я обнаружил, что шаблон поиска

abc[\w\W]*xyz 

работает в https://regex101.com/

почему он не работает в vim?

Ответ 1

Приведенная ниже команда должна работать, если только "любой символ" означает для вас что-то другое, чем для Vim:

:g/abc.*xyz
  • . означает "любой символ, кроме EOL".
  • * означает "любое число (включая 0) предыдущего атома".
  • 1,$ можно сократить до %.
  • :global работает по всему буфере по умолчанию, поэтому вам даже не нужен %.
  • Закрытие / не требуется, если вы не следуете :g/pattern с помощью команды, как в :g/foo/d.

Ответ 2

Как только файл становится слишком большим (скажем, 1 ГБ), ": g/abc. * xyz" становится довольно медленным.

Я обнаружил, что

cat fileName | grep abc | grep xyz >> searchResult.txt

более эффективен, чем использование функции поиска в vim.

Я знаю, что этот метод может возвращать строки, начинающиеся с "xyz" и заканчивающиеся на "abc".

Но так как это редкий случай в моем файле (и, возможно, это не так часто случается для других людей), я думаю, что я должен написать этот метод здесь.

Ответ 3

Кажется, что внутри синтаксиса коллекции [..] нельзя использовать классы символов, такие как \w , возможно, потому, что он проверяет посимвольно стратегия. От :h /[]:

Совпадение с коллекцией может быть медленным, поскольку каждый символ в       текст нужно сравнивать с каждым персонажем в коллекции.       По возможности используйте один из других атомов выше. Пример: "\ d"       намного быстрее, чем "[0-9]" и соответствует тем же символам.

Однако вы можете использовать аналогичные функции, специально подготовленные для синтаксиса [..]. С :h /[] снова:

Выражение символьного класса оценивается по набору символов       принадлежащих этому классу символов.

Примеры

включают:

[:alnum:]     letters and digits                   
[:alpha:]     letters                              
[:blank:]     space and tab characters             
[:cntrl:]     control characters                   
[:digit:]     decimal digits                       
[:graph:]     printable characters excluding space 
[:lower:]     lowercase letters

Ответ 4

Если вы хотите найти их один за другим, вы можете нажать

/

а затем напишите

abc.*xyz

и нажмите Enter, чтобы найти первое вхождение шаблона. Затем используйте n для следующего вхождения и Shift + n для предыдущего. Я так обычно и делаю, потому что для меня это легче изменить.