Сопоставить доменное имя с URL (www.google.com = google) - PullRequest
3 голосов
/ 08 февраля 2010

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

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", но кажется, что я делаю что-то не так ... (не работает ли с регулярным выражением вне \ (\) ...)

Ответы [ 5 ]

1 голос
/ 08 февраля 2010

Это выведет "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 голос
/ 08 февраля 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
0 голосов
/ 08 февраля 2010

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

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

 echo "http://www.google.com/test/" | sed -nr "s/.*www\.(.*)\.(?:com|net).*$/\1/p"
0 голосов
/ 08 февраля 2010
#! /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
0 голосов
/ 08 февраля 2010
s|http://(www\.)?([^.]*)|$2|

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

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