0

嗨,如何使用 sed 或 awk 提取与正则表达式匹配的子字符串。

我见过几个修改或更改子字符串,但我只想获得匹配的部分。

我的数据如下所示:

<loc>http://www.A.com/sitemap1.gz</loc>
<loc>http://www.A.com/sitemap2.gz</loc>
<loc>http://www.A.com/sitemap3.gz</loc>
<loc>http://www.A.com/sitemap4.gz</loc>
<loc>http://www.A.com/sitemap5.gz</loc>
<loc>http://www.A.com/sitemap6.gz</loc>
<loc>http://www.A.com/sitemap7.gz</loc>
<loc>http://www.A.com/sitemap8.gz</loc>

输出应该看起来像

http://www.A.com/sitemap1.gz
http://www.A.com/sitemap2.gz
http://www.A.com/sitemap3.gz
....

我试过了

cat data | sed 's/'http.*gz'//' 

但这个命令实际上删除了我想要保留的部分。谢谢

4

2 回答 2

4

一个简单grep-o选项:

$ grep -o 'http[^<]*' file
http://www.A.com/sitemap1.gz
http://www.A.com/sitemap2.gz
http://www.A.com/sitemap3.gz
http://www.A.com/sitemap4.gz
http://www.A.com/sitemap5.gz
http://www.A.com/sitemap6.gz
http://www.A.com/sitemap7.gz
http://www.A.com/sitemap8.gz

awk可以这样做:

$ awk -F'[<>]' '{print $3}' file
http://www.A.com/sitemap1.gz
http://www.A.com/sitemap2.gz
http://www.A.com/sitemap3.gz
http://www.A.com/sitemap4.gz
http://www.A.com/sitemap5.gz
http://www.A.com/sitemap6.gz
http://www.A.com/sitemap7.gz
http://www.A.com/sitemap8.gz
于 2013-08-15T20:28:29.287 回答
2

这个 sed 应该工作:

sed 's/^.*\(http.*gz\).*$/\1/' file

或者 grep -P (--perl-regexp) 也可以完成这项工作:

grep -Po '(?<=<loc>).*?(?=</loc>)' file
于 2013-08-15T20:27:09.453 回答