使用sed提取CentOS镜像域名

时间:2013-08-22 18:15:30

标签: sed centos6

我试图仅从http://mirrorlist.centos.org/?release=6.4&arch=x86_64&repo=os提取CentOS域名列表 将前缀“http://”和“ftp://”截断为第一个“/”字符,仅显示

列表

yum.phx.singlehop.com
mirror.nyi.net
bay.uchicago.edu
centos.mirror.constant.com
mirror.teklinks.com
centos.mirror.netriplex.com
centos.someimage.com
mirror.sanctuaryhost.com
mirrors.cat.pdx.edu
mirrors.tummy.com

我搜索了stackoverflow的sed方法,但我仍然遇到了麻烦。

我尝试用sed做这个 curl "http://mirrorlist.centos.org/?release=6.4&arch=x86_64&repo=os" | sed '/:\/\//,/\//p'
但看起来并没有做任何事情。你能给我一些建议吗?

1 个答案:

答案 0 :(得分:0)

你走了:

curl "http://mirrorlist.centos.org/?release=6.4&arch=x86_64&repo=os" | sed -e 's?.*://??' -e 's?/.*??'

您的sed完全错误:

  • /x/,/y/范围。它从匹配/x/的行中选择多个,直到匹配/y/的行
  • p命令打印所选范围

由于所有行都匹配您使用的开始和结束模式,因此您有效地选择了所有行。并且,由于sed默认情况下会回显输入,p命令会产生重复的行(所有行都打印两次)。

在我的修复中:

  • 我使用了s???而不是s///,因为这样我就不需要在模式中转义所有/,所以这种方式更具可读性
  • 我使用了-e标志的两个表达式:
    • s?.*://??匹配://之前的所有内容并将其替换为
    • s?/.*??匹配从/到最后用“
    • ”替换它的所有内容
  • 这两个表达式按给定顺序执行
  • sed的现代版本中,您可以省略-e并将这两个表达式与;分开。我坚持使用-e因为它更便携。