Как заменить N-й вхождение шаблона, чтобы добавить дополнительные термины в vim - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть:

elif paramo == 3:
    fold_path = [Pk_Path+"ns_up", Pk_Path+"ns_up2", Pk_Path+"fid", Pk_Path+"ns_dw", Pk_Path+"ns_dw2"]
    CC_path = ["C_ns_up", "C_ns_up2", "C_fid", "C_ns_dw", "C_ns_dw2"] 

, и я хотел бы получить:

elif paramo == 3:
    fold_path = [Pk_Path+"ns_up", Pk_Path+"ns_up2", Pk_Path+"ns_up3", Pk_Path+"fid", Pk_Path+"ns_dw", Pk_Path+"ns_dw2", Pk_Path+"ns_dw3"]
    CC_path = ["C_ns_up", "C_ns_up2", "C_ns_up3", "C_fid", "C_ns_dw", "C_ns_dw2", "C_ns_dw3"] 

Для первой строки я могу добавить дополнительные Pk_Path+"ns_up3" после Pk_Path+"ns_up2", выполнив:

:'<,'>s/, Pk_Path+\(.\{-}\)_up2"/, Pk_Path+\1_up2", Pk_Path+\1_up3"/g

и его вставки "ns_up3":

elif paramo == 3:
    fold_path = [Pk_Path+"ns_up, "Pk_Path+"ns_up2", Pk_Path+"ns_up3", Pk_Path+"fid", Pk_Path+"ns_dw", Pk_Path+"ns_dw2"]
    CC_path = ["C_ns_up", "C_ns_up2", "C_fid", "C_ns_dw", "C_ns_dw2"] 

Но для другого термина Pk_Path+"ns_dw3" я попытался сделать:

:'<,'>s/, Pk_Path+\(.\{-}\)_dw2"/Pk_Path+\1_dw2", Pk_Path+\1_dw3"/g

но это дало неправильные результаты:

elif paramo == 3:
    fold_path = [Pk_Path+"ns_up"Pk_Path+"ns_up2"Pk_Path+"ns_up3", Pk_Path+"fid", Pk_Path+"ns_dw", Pk_Path+"ns_dw2", Pk_Path+"ns_up3", Pk_Path+"fid", Pk_Path+"ns_dw", Pk_Path+"ns_dw3"]
    CC_path = ["C_ns_up", "C_ns_up2", "C_fid", "C_ns_dw", "C_ns_dw2"]

Я не знаю, как явно указать, что я хочу вставить Pk_Path+"ns_dw3" после шестой строки Pk_Path.

Я протестировалСледующая команда с \zs, я не понимаю, почему это не работает:

:'<,'>s/\(\zsPk_Path\)\{6}+"\(.\{-}\)_dw2"/Pk_Path+\2_dw3"/g

Кажется, я беру шестое вхождение Pk_Path с ns_dw2, затем добавляю \2 pattern и ns_dw3 string.

Откуда моя ошибка?

1 Ответ

1 голос
/ 05 ноября 2019

Команда :substitute имеет необязательный аргумент [count];к сожалению, он просто ограничивает замену количеством строк , и не подсчитывает совпадения.

Единственным встроенным параметром является предоставление флага c onfirmи ответьте на запросы с помощью nnnnnl, чтобы просто заменить 6-е совпадение.

В качестве альтернативы вы можете реализовать подсчет внутри шаблона, сопоставив предыдущие элементы с \%(...\)\{5}, а затем начав фактическое сопоставление. с :help /\zs. Но писать это действительно громоздко, и вам нужно продублировать шаблон (например, \%(foo\)\{5}\zsfoo).

My Плагин PatternsOnText имеет (среди прочего) вариант :SubstituteSelected, в котором вы можете напрямуюукажите количество (как 2,5 или 3-5 или даже повторяющиеся y3nyyn ответы).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...