Если вы хотите сделать это с помощью регулярного выражения, вы можете попробовать настроить следующее: %s!\v%(^http://%(www\.)?(%([^./]+\.)+[^./]+)%(/.*)?$\_.{-})@<=^http://%(www\.)?\1%(/.*)?\n!!g
, но оно будет очень медленным на 6 миллиардах URL и не работает по неизвестной причине. , Вот лучший подход:
:let g:gotDomains={}
:%g/^/let curDomain=matchstr(getline('.'), '\v^http://%(www\.)?\zs[^/]+') | if !has_key(g:gotDomains, curDomain) | let g:gotDomains[curDomain]=1 | else | delete _ | endif
Это делает следующее:
let g:gotDomains={}
создает пустой словарь, в котором мы будем хранить все домены
%g/^/{command}
выполнить {command}
в каждой строке
let curDomain=matchstr(...)
получить доменное имя
getline('.')
от текущей строки
\v
позвольте мне не писать много обратных слешей в регулярных выражениях (очень волшебно)
^
от начала строки
\zs
начать матч отсюда (не захватывать все до \zs
)
if !has_key(g:gotDomains, curDomain)
, если домен еще не был создан.
let g:gotDomains[curDomain]=1
затем добавьте его в список известных доменов (здесь нам не нужно 1
, я использую словарь только для более быстрого доступа).
delete _
иначе удалите строку в регистр черная дыра (это означает, что не сохраняйте его содержимое в каких-либо регистрах).