Сопоставить доменное имя с URL-адресом (www.google.com=google)

Итак, я хочу сопоставить только домен из эфира:

http://www.google.com/test/
http://google.com/test/
http://google.net/test/

Вывод должен быть для всех 3: google

У меня этот код работает только для .com

echo "http://www.google.com/test/" | sed -n "s/.*www\.\(.*\)\.com.*$/\1/p"
Output: 'google'

Тогда я подумал, что это будет так же просто, как сказать (com|net), но это не похоже на правду:

echo "http://www.google.com/test/" | sed -n "s/.*www\.\(.*\)\.(com|net).*$/\1/p"
Output: '' (nothing)

Я собирался использовать аналогичный метод, чтобы избавиться от «www», но, похоже, я делаю что-то не так… (разве это не работает с регулярным выражением вне \(\)…)


person Mint    schedule 08.02.2010    source источник
comment
Пока вы ограничиваете проблемный домен (каламбур) URL-адресами, подобными перечисленным, регулярные выражения могут адекватно служить этой цели. Если вам также необходимо иметь дело с такими URL-адресами, как www.someuniverisity.ac.uk или products.somecompany.co.jp или даже www.cityofwherever.somestate.us, может быть целесообразно использовать более выразительные языки общего назначения (которые, возможно, могут использовать RE как часть своей логики синтаксического анализа, но также сможет реализовать более сложный и развивающийся набор правил)   -  person mjv    schedule 08.02.2010
comment
Технически google.com и www.google.com являются доменными именами. Похоже, вас интересует доменное имя второго уровня. :)   -  person deceze♦    schedule 08.02.2010
comment
Да, хорошо, домен второго уровня, я знал, что неправильно назвал его, но я не мог вспомнить, как он называется, поэтому я подумал, что вы поймете, что я имел в виду, с некоторыми примерами :)   -  person Mint    schedule 08.02.2010


Ответы (5)


Это выведет «google» во всех случаях:

sed -n "s|http://\(.*\.\)*\(.*\)\..*|\2|p"

Изменить:

Эта версия будет обрабатывать такие URL-адреса, как "'http://google.com.cn/test" и " http://www.google.co.uk/", а также в оригинале вопрос:

sed -nr "s|http://(www\.)?([^.]*)\.(.*\.?)*|\2|p"

Эта версия будет обрабатывать случаи, которые не включают "http://" (плюс другие):

sed -nr "s|(http://)?(www\.)?([^.]*)\.(.*\.?)*|\3|p"
person Dennis Williamson    schedule 08.02.2010
comment
это не удается, например, на www.google.com.cn. Если у OP действительно нет такого URL-адреса для анализа. - person ghostdog74; 08.02.2010
comment
Ах да, этот работает еще лучше! Спасибо, Деннис, кажется, ты помог мне со многими моими вопросами :) (Мне не нужен www.google.com.cn для работы, но кто знает) - person Mint; 08.02.2010

если у вас есть Python, вы можете использовать модуль urlparse

import urlparse
for http in open("file"):
    o = urlparse.urlparse(http)
    d = o.netloc.split(".")
    if "www" in o.netloc:
        print d[1]
    else:
        print d[0]

выход

$ cat file
http://www.google.com/test/
http://google.com/test/
http://google.net/test/

$ ./python.py
google
google
google

или вы можете использовать awk

awk -F"/" '{
    gsub(/http:\/\/|\/.*$/,"")
    split($0,d,".")
    if(d[1]~/www/){
        print d[2]
    }else{
        print d[1]
    }
} ' file

$ cat file
http://www.google.com/test/
http://google.com/test/
http://google.net/test/
www.google.com.cn/test
google.com/test

$ ./shell.sh
google
google
google
google
google
person ghostdog74    schedule 08.02.2010

s|http://(www\.)?([^.]*)|$2|

Это Perl с альтернативными разделителями (потому что это делает его более разборчивым), я уверен, что вы можете портировать его на sed или что вам нужно.

person Anon.    schedule 08.02.2010

Вы пытались использовать ключ «-r» в своей команде sed? Это включает расширенный режим регулярных выражений (регулярные выражения, совместимые с egrep).

Изменить: попробуйте это, кажется, это работает. Символы "?:" перед com|net предназначены для предотвращения захвата этого набора символов окружающими их круглыми скобками.

 echo "http://www.google.com/test/" | sed -nr "s/.*www\.(.*)\.(?:com|net).*$/\1/p"
person Guillaume Gervais    schedule 08.02.2010
comment
Ага: пользователь:~# echo http\://www.google.com/test/ | sed -n -r s/.*www\.(.*)\.(com|net).*$/\1/p; ничего не возвращает, как -E (уберите \ из URL-адреса) - person Mint; 08.02.2010
comment
См. мой отредактированный ответ: поскольку вы находитесь в расширенном режиме регулярных выражений, вам не нужно экранировать круглые скобки для захвата символов. - person Guillaume Gervais; 08.02.2010
comment
Спасибо! покупает тебе пиво (или что-то в этом роде): P Я всегда путаюсь, когда и где нельзя использовать побеги. - person Mint; 08.02.2010
comment
Ого, я этого не заметил, хотя я бы заметил, когда начал его использовать: P (но это помогло, поскольку я мог отредактировать его код, чтобы решить другую мою проблему :)) - person Mint; 08.02.2010
comment
@Guillaume: мне кажется, что :? не работает: echo "aaabbbccc"|sed -nr 's/(a*)(:?b*)(c*)/\1 \2/p' производит aaa bbb - person Dennis Williamson; 08.02.2010
comment
?: выдает ошибку в sed. (кстати, вы изменили свое описание, но не команду) - person Dennis Williamson; 09.02.2010

person    schedule
comment
это не даст правильных результатов для URL-адреса, такого как www.google.com.cn. - person ghostdog74; 08.02.2010