2010-02-08 2 views
3

Так что я хочу, чтобы соответствовать только домен из эфира:Match доменное имя из URL (www.google.com = Google)

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

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

I получил этот код работает только .com

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

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

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

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

+1

До тех пор, пока вы ограничиваете область проблем (предназначенную для каламбуров) для URL-адреса, аналогичного указанному, регулярные выражения могут адекватно служить цели. Если вам также необходимо иметь дело с такими URL-адресами, как «www.someuniverisity.ac.uk» или «products.somecompany.co.jp» или даже «www.cityofwherever.somestate.us», может быть целесообразно использовать более выразительные и общие (которые, возможно, могли бы использовать RE как часть их логики синтаксического анализа, но также могли бы реализовать более сложный и изменяющийся набор правил) – mjv

+2

Технически «google.com» и «www.google.com» * являются * именами доменов. Кажется, вас интересует доменное имя * второго уровня *.:) – deceze

+0

Да, хорошо, что это домен второго уровня, я знал, что у меня был неправильный термин для него, но я не мог вспомнить, как его называли, поэтому я подумал, что вы получите то, что я имел в виду, с некоторыми примерами :) – Mint

ответ

1

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

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

Edit:

Эта версия будет обрабатывать 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" 
+1

это не удается, например, на www.google.com.cn. Если у OP действительно нет такого URL-адреса для разбора. – ghostdog74

+0

+1 для второй версии. – ghostdog74

+0

Ах, да, это работает еще лучше! Спасибо, Деннис, вы, кажется, помогаете мне с распределением моих вопросов :) (мне не нужно www.google.com.cn работать, но вы никогда не знаете) – Mint

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

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

0

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

Редактировать: попробуйте, это работает. Символы «?:» Перед com | net - это предотвращение захвата этого набора символов их окружающими круглыми скобками.

echo "http://www.google.com/test/" | sed -nr "s/.*www\.(.*)\.(?:com|net).*$/\1/p" 
+0

Yep: user: ~ # echo "http \: //www.google.com/test/" | sed -n -r "s /.* www \. \ (. * \) \. (com | net). * $/\ 1/p"; не возвращает ничего, как «-E» (вытащите «\» из URL-адреса) – Mint

+0

См. отредактированный ответ: поскольку вы находитесь в режиме расширенного регулярного выражения, вам не нужно скрывать скобки для захвата символов. –

+0

Спасибо! * покупает вам пиво * (или что когда-либо): P Я всегда смущаюсь, когда и где не использовать экраны. – Mint

0
#! /bin/bash 

urls=(      \ 
    http://www.google.com/test/ \ 
    http://google.com/test/  \ 
    http://google.net/test/  \ 
) 

for url in ${urls[@]}; do 
    echo $url | sed -re 's,^http://(.*\.)*(.+)\.[a-z]+/.+$,\2,' 
done 
+1

это не даст правильные результаты для URL-адреса, например www.google.com.cn – ghostdog74

+0

@ Требование к Ghost. –

1

если у вас есть 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 
Смежные вопросы