【问题标题】:sed awk get substring instead - regexsed awk 改为获取子字符串 - 正则表达式
【发布时间】:2013-08-16 04:28:29
【问题描述】:

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

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

【问题讨论】:

    标签: regex sed awk


    【解决方案1】:

    一个简单的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
    

    【讨论】:

    • 如果我理解正确,^ 就像拒绝符号,所以匹配直到遇到'
    • 正确,但是 &lt;loc 不会被视为一个单词,而是一组称为字符类的字符。
    • 你怎么能当成一个词呢?这将非常有帮助
    • 你会想要lookarounds@anubhava 答案使用正向前瞻和后向。要匹配任何不跟随给定单词的字符串,您需要否定前瞻。 Lookarounds 不是 BRE (基本正则表达式) 甚至 ERE (扩展正则表达式) 的一部分,因此请检查您的语言/环境是否支持它们。
    【解决方案2】:

    这个 sed 应该可以工作:

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-01-23
      • 2011-08-13
      • 2013-04-13
      • 2012-02-21
      • 1970-01-01
      • 2017-06-07
      • 2015-10-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多