Поиск 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
для предыдущего. Я так обычно и делаю, потому что для меня это легче изменить.