vim: найти строку, содержащую шаблон, которого нет в соседних строках

vim: найти строку, содержащую шаблон, которого нет в соседних строках

Я хочу найти способ показать все строки, которые содержат определенный шаблон, но его соседние (предыдущие, следующие) строки не содержат.

например: допустим, шаблон — это слово «УЗОР»

1.#########################

2.#########УЗОР#########

3.##############################

то 2-я строка действительна и отображается.

НО

1.#########################

2.#########УЗОР#########

3.#########УЗОР#########

4.##############################

то 2-я и 3-я строки недействительны, поэтому не будут показаны

решение1

Вам следует использовать группы захвата регулярных выражений следующим образом:

/\v%(PATTERN.*\n.*)@<!(PATTERN)%(.*\n.*\1)@!

Пример

Это может показаться пугающим, но на самом деле все довольно просто:

  1. \vиспользуется для включения"очень волшебно"регулярное выражение (избегает использования обратных косых черт для большинства специальных символов)
  2. PATTERN.*\n.*is PATTERN, за которым следует что-либо, новая строка и снова что-либо
  3. (...)@<!это модель отрицательного взгляда назад: это означает, что мыне хочучто находится между скобками, чтобы существовать. Так что в нашем случае, все шаги 2не должны существовать
  4. (PATTERN)Это наше настоящее слово, оно должно существовать! Мы фиксируем его скобками для будущего использования
  5. .*\n.*\1что угодно, новая строка, что угодно снова, и наша захваченная группа (см. шаг 4)
  6. %(...)@!это отрицательный взгляд вперед, как и прежде, мы не хотим, чтобы существовало то, что находится между фигурными скобками.

Итак, по сути, мы хотим PATTERN, а именно:

  • не предшествует строка, содержащаяPATTERN
  • не сопровождается строкой, содержащейPATTERN

Связанный контент