Найдите строки в Vim, которые начинаются одним образом и не заканчиваются другим образом.

Вопрос или проблема

Я пытаюсь использовать Vim, чтобы найти, через /, строки, которые начинаются и заканчиваются определённым образом. В частности, я ищу строки, которые начинаются с символа > и не оканчиваются строкой RNA в самом конце. Например, я хочу найти эту строку

>NM_001010867.4 Homo sapiens iron-sulfur cluster assembly factor IBA57 (IBA57), transcript variant 1, mRNA; nuclear gene for mitochondrial product

в поиске, но не хочу находить эту строку

>NR_107042.1 Homo sapiens microRNA 8075 (MIR8075), microRNA

Я долго искал решение, но так и не смог его найти. Буду очень благодарен за любую помощь.

Используйте:

^>\(.*RNA$\)\@!

Где \@! – это оператор отрицательного предвосхищения, специфичный для vim, эквивалентный перловскому (?!...).

Это означает: соответствовать > в начале строки (^), при условии, что за ним не следует (\@!, примененный к группе \(...\)) любое количество (*) символов (.), за которыми следует RNA, за которым следует конец строки ($).

То же самое с \very-magic, где большинство расширенных операторов не требуют префикса \:

^>\v(.*RNA$)@!

(здесь включено после >, так как > сам с very-magic был бы оператором границы слова).

^>.*[^R][^N][^A]$ из @user10489’s answer неверно, потому что оно не совпадает, например, с > RXX или любой строкой, последний символ которой A, или предпоследний N, или третий с конца R, или состоит менее чем из 4 символов.

>.*[^(RNA.)][\n] из @Romyo’s answer не имеет никакого смысла, так как [^(RNA.)] соответствует любому одиночному символу, кроме R, N, A, ., ( или ).

/^>.*[^R][^N][^A]$

Также можно использовать grep (без ведущего /)

:/>.*[^(RNA.)][\n]

Из этих строк

helo
hello
>helloRNA.
>helloN00
>hell]RNA.
>twm0

выбраны только “>helloN00” и “>twm0”

очевидно

  • /> означает, что строка должна начинаться с ‘>’
  • .* означает соответствие любому количеству символов
  • [^(RNA.)] не заканчивайте ‘^’ этой строкой
  • [\n] конец строки

Ответ или решение

В вашем запросе о поиске строк в Vim, которые начинаются с символа >, но не заканчиваются на строку RNA, необходимо использовать специальные регулярные выражения, специфичные для Vim. Ниже я опишу, как это сделать, и дам примеры для лучшего понимания.

Использование регулярных выражений в Vim

Чтобы найти строки, начинающиеся с >, и не заканчивающиеся на RNA, вам нужно использовать комбинацию операторов соответствия:

  1. Начало строки (^): Указывает на то, что символы должны появляться в начале строки.
  2. Символы (>): Необходимо указать, что строка начинается с этого символа.
  3. Любые символы (.*): Указывает, что могут следовать любые символы (ноль и более).
  4. Отрицательное предшествующее условие (\@!): Учитывает, что за символами могут следовать определенные слова или символы, которые не должны появляться в конце.
  5. Конец строки ($): Указывает, что мы проверяем символы именно в конце строки.

Регулярное выражение

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

/^>\(.*RNA\)$\@!

Здесь:

  • ^> — начало строки с символом >.
  • \(.*RNA\) — все символы и в конце строка RNA.
  • \@! — отрицательное предшествующее условие, которое исключает строки, оканчивающиеся на RNA.

Вариант с very-magic

Вы также можете использовать режим very-magic, где многие специальные символы не требуют обратной косой черты:

^>\v(.*RNA$)@!

Этот вариант более читаем и менее загружен символами, но выполняет ту же функцию.

Примеры использования

Предположим, у вас есть следующие строки:

>NM_001010867.4 Homo sapiens iron-sulfur cluster assembly factor IBA57 (IBA57),transcript variant 1, mRNA; nuclear gene for mitochondrial product
>NR_107042.1 Homo sapiens microRNA 8075 (MIR8075), microRNA
>helloRNA.
>helloN00
>hell]RNA.
>twm0

Используя ваше регулярное выражение, вы получите результат:

  • Найдено: >helloN00, >twm0
  • Не найдено: >NM_001010867.4, >NR_107042.1, >helloRNA., >hell]RNA. (они оканчиваются на RNA).

Заключение

Использование Vim для поиска строк с определёнными условиями — это мощный способ работы с текстом. Освоив регулярные выражения, вы значительно упростите свои задачи по обработке текста. Вышеописанные методы являются простыми, но эффективными для решения задачи поиска строк, начинающихся с определённого символа и не оканчивающихся на заданную строку.

Это позволяет не только оптимизировать рабочий процесс, но и минимизировать вероятность ошибок при анализе текста. Если у вас возникнут дополнительные вопросы или нужны уточнения, пожалуйста, не стесняйтесь обращаться.

Оцените материал
Добавить комментарий

Капча загружается...