0

我正在尝试仅从http://mirrorlist.centos.org/?release=6.4&arch=x86_64&repo=os 将前缀“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'
但看起来它没有做任何事情。你能给我一些建议吗?

4

1 回答 1

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,因为它更便携。
于 2013-08-22T18:23:53.320 回答