sed awk取代子串 - 正则表达式

时间:2013-08-15 20:23:58

标签: regex sed awk

您好如何使用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'//' 

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

这个sed应该有效:

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

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

grep -Po '(?<=<loc>).*?(?=</loc>)' file