sed的特殊字符

时间:2012-08-23 04:12:45

标签: url sed character

我正在尝试从网络链接中删除网址

比如说,我想把http://site.com/path/to/site.html打印出'site.com'或'http://site.com'

这是我能找到的最接近的但是它无法正常工作:

echo "https://site.com/shisad/sadh" | sed -n "s/.*\(http.*\/\).*/\1/p"

打印:https://site.com/shisad/

我认为这个特殊字符'/'我做错了。任何想法?

3 个答案:

答案 0 :(得分:2)

  1. 当您使用sed匹配路径名或其他包含斜杠的模式时,请使用斜杠以外的字符来分隔正则表达式;它让生活变得更轻松。

  2. .*模式贪婪;它匹配最长的字符串。你想要一个更有约束力的表达。

  3. 要打印http://site.com,您可以使用:

    sed -n 's%.*\(https\{0,1\}://[^/]*\).*%\1%p'
    

    要打印site.com,您可以使用:

    sed -n 's%.*https\{0,1\}://\([^/]*\)/.*%\1%p'
    

    如果您认为主机名后面可能没有斜杠的网站(因此输入只包含http://site.com),那么您可以使用:

    sed -n -e 's%.*https\{0,1\}://\([^/]*\)/.*%\1%p' \
           -e 's%.*https\{0,1\}://\([^/]*\)$%\1%p'
    

    请注意,这些字符串会接受各种标点字符作为“有效”字样;如果您希望使用[-a-zA-Z0-9_.]*来代替[^/]*,您可能会更具辨别力 - 但要注意国际化域名。 URL后面的两个模式版本不会停在空白处;它将包括(http://example.com)的右括号。这是关于哪些字符有效的一个必然结果。

答案 1 :(得分:1)

echo "https://site.com/shisad/sadh"|awk -F/ '{print $1"//"$2$3}'

答案 2 :(得分:0)

我假设你正在使用GNU sed

echo "https://site.com/shisad/sadh" | sed -r 's%.*(https://[^/]*).*%\1%'
https://site.com

要获得域名,您只需更改存储括号的位置:

echo "https://site.com/shisad/sadh" | sed -r 's%.*https://([^/]*).*%\1%'
site.com

您当然可以使用简单的perl grep执行您想要的操作:

echo "https://site.com/shisad/sadh" | grep -oP 'https://[^/]*'
https://site.com