Позитивное утверждение и замещение Vim?

Я хотел бы использовать Vim для соответствия регулярному выражению и выполнить подстановку. У меня есть файл tsv с строками, которые выглядят так:

rs11223-A        -A
rs23300-G        -TTA
rs9733-T          -G
rs11900000-GT    -TTG

Я хочу заменить символ тире (-) для вкладки только в первом столбце после rs...

В Vim я пытался выполнить подстановку, используя:

:%s/(?<=^rs[0-9]{1,12})-/\t/g   

Может ли кто-нибудь указать, что моя проблема, и правильное решение?

Ответ 1

Это может зависеть от конфигурации, но в моей среде мне нужно добавить { , } с помощью \.

Кроме того, Vim имеет \zs и \ze, чтобы начинать и заканчивать совпадение, поэтому вам обычно не приходится иметь дело с обычным обратным просмотром регулярных выражений.

Это делает то, что вы хотите:

:%s/^rs\d\{1,12}\zs-/\t/g

Ответ 2

Положительный внешний вид выполняется с помощью:

\@<=

Итак, вы можете использовать что-то вроде:

:%s/\d\@<=-/\t/g

Ваши фактические данные могут быть более сложными, но с тем, что вы опубликовали, вы также можете просто решить:

:%s/-/\t

Если rs должно быть в начале строки, вы можете использовать \zs, чтобы указать начало матча и использовать привязку (^):

:%s/^rs\d*\zs-/\t

Ответ 3

Вы хотите следующее:

%s/^\(rs[0-9]\{1,12\}\)-/\1\t/g

Регулярные выражения Vim требуют некоторых специальных управляющих последовательностей для {, }, ( и ).

Кроме того, в разделе подстановки вам понадобится \1, чтобы вставить соответствующую строку.