Регулярное выражение в gVim для удаления дублирующихся доменов из списка - PullRequest
1 голос
/ 23 октября 2010

Мне нужно регулярное выражение, написанное для использования в gVim, которое удалит дублирующиеся домены из списка URL-адресов (gVim можно скачать здесь: http://www.vim.org/download.php

У меня есть список из более чем 6 000 000 URL-адресов в a.TXT-файл (который открывается в gVim для редактирования).

URL-адреса имеют следующий формат:

http://www.example.com/some-url.php
http://example2.com/another_url.html
http://example3.com/
http://www.example4.com/anotherURL.htm
http://www.example.com/some-url2.htm
http://example.com/some-url3.html
http://www.example2.com/somethingelse.php
http://example5.com

Другими словами, нет определенного формата URL-адресов. Некоторые имеют WWWнекоторые не имеют, все они имеют разные форматы.

Мне нужно регулярное выражение, написанное для gVim, которое удалит все дубликаты DOMAIN из списка (и его соответствующий URL), оставив позади первый найденный экземпляр.

Таким образом, потребуется список примеров, приведенный выше, и конечный результат должен выглядеть следующим образом:

http://www.example.com/some-url.php
http://example2.com/another_url.html
http://example3.com/
http://www.example4.com/anotherURL.htm
http://example5.com

Вот два замечательных сайта, которые довольно красиво объясняют, как использовать регулярные выражения в gVim.:

http://supportweb.cs.bham.ac.uk/documentation/tutorials/docsystem/build/tutorials/gvim/gvim.html#Vi-Regular-Expressions

http://www.softpanorama.org/Editors/Vimorama/vim_regular_expressions.shtml

Ответы [ 2 ]

4 голосов
/ 23 октября 2010

Если вы хотите сделать это с помощью регулярного выражения, вы можете попробовать настроить следующее: %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

Это делает следующее:

  1. let g:gotDomains={} создает пустой словарь, в котором мы будем хранить все домены
  2. %g/^/{command} выполнить {command} в каждой строке
  3. let curDomain=matchstr(...) получить доменное имя

    1. getline('.') от текущей строки
    2. \v позвольте мне не писать много обратных слешей в регулярных выражениях (очень волшебно)
    3. ^ от начала строки
    4. \zs начать матч отсюда (не захватывать все до \zs)
  4. if !has_key(g:gotDomains, curDomain), если домен еще не был создан.

  5. let g:gotDomains[curDomain]=1 затем добавьте его в список известных доменов (здесь нам не нужно 1, я использую словарь только для более быстрого доступа).
  6. delete _ иначе удалите строку в регистр черная дыра (это означает, что не сохраняйте его содержимое в каких-либо регистрах).
0 голосов
/ 23 октября 2010

Попробуйте это:

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