Вопрос или проблема
Я пытаюсь использовать 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
, за которым следует конец строки ($
).
То же самое с \v
ery-magic, где большинство расширенных операторов не требуют префикса \
:
^>\v(.*RNA$)@!
(здесь включено после >
, так как >
сам с very-magic был бы оператором границы слова).
из @user10489’s answer неверно, потому что оно не совпадает, например, с ^>.*[^R][^N][^A]$
> RXX
или любой строкой, последний символ которой A
, или предпоследний N
, или третий с конца R
, или состоит менее чем из 4 символов.
из @Romyo’s answer не имеет никакого смысла, так как >.*[^(RNA.)][\n]
[^(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
, вам нужно использовать комбинацию операторов соответствия:
- Начало строки (
^
): Указывает на то, что символы должны появляться в начале строки. - Символы (
>
): Необходимо указать, что строка начинается с этого символа. - Любые символы (
.*
): Указывает, что могут следовать любые символы (ноль и более). - Отрицательное предшествующее условие (
\@!
): Учитывает, что за символами могут следовать определенные слова или символы, которые не должны появляться в конце. - Конец строки (
$
): Указывает, что мы проверяем символы именно в конце строки.
Регулярное выражение
Весь шаблон будет выглядеть следующим образом:
/^>\(.*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 для поиска строк с определёнными условиями — это мощный способ работы с текстом. Освоив регулярные выражения, вы значительно упростите свои задачи по обработке текста. Вышеописанные методы являются простыми, но эффективными для решения задачи поиска строк, начинающихся с определённого символа и не оканчивающихся на заданную строку.
Это позволяет не только оптимизировать рабочий процесс, но и минимизировать вероятность ошибок при анализе текста. Если у вас возникнут дополнительные вопросы или нужны уточнения, пожалуйста, не стесняйтесь обращаться.