【问题标题】:Get previous href after match using grep, sed or awk使用 grep、sed 或 awk 在匹配后获取上一个 href
【发布时间】:2016-05-17 20:46:18
【问题描述】:

我有一个未格式化的 html 文件,我需要在其中获取匹配前的 href 链接...我的 html 文件如下所示:

<a href="url1.com">Bla Bla Bla [Test1]</a><a href="url2.com">Bla Bla Bla [Test2]</a><a href="url3.com">Bla Bla Bla [Test3]</a>

所以现在我需要在 [Test2] 模式之前获取 href 内容,并且预期的返回是 url2.com。

我不是 sed 或 awk 专家,我认为纯 grep 命令不可能。

我可以使用下面的命令知道我的partern是否存在于文件中,但我不知道如何获取以前的href。

grep -o '\[S06E04\]' file.html

非常感谢任何帮助。

谢谢

【问题讨论】:

  • 一般来说,使用需要行分隔数据的工具来处理非行分隔的数据(例如 XML)并不是一个好主意。请改用xmlstarlet 之类的东西。
  • @MichaelVehrs : html 看起来像是缩小了...

标签: bash awk sed


【解决方案1】:

这应该可行:

sed -n 's/.*href="\([^"]*\)">.*\[Test2\].*/\1/p' file
url2.com

使用 GNU grep:

grep -oP '(?<=href=")[^"]*(?=">[^<>]*\[Test2\])' file
url2.com

【讨论】:

    【解决方案2】:
    $ awk -F'[[\\]"]' '{for (i=1; i<=NF; ++i) {if ($i == "Test2") print $(i-2)}}' w.txt
    
    url2.com
    

    【讨论】:

      【解决方案3】:

      grep 与 PCRE (-P) 一起使用:

      grep -Po 'href="\K[^"]+(?="[^[]+\[Test2\])' file.html
      
      • href=" 在所需 URI 之前匹配,\K 丢弃匹配

      • [^"]+ 得到想要的部分

      • 零宽度正向前瞻模式(?="[^[]+\[Test2\]) 确保匹配后跟方括号中的任何内容,但[Test2]


      使用sed的类似逻辑:

      sed -E 's/.*[[:blank:]]href="([^"]+)"[^[]+\[Test2\].*/\1/' file.html
      

      示例:

      $ grep -Po 'href="\K[^"]+(?="[^[]+\[Test2\])' <<<'<a href="url1.com">Bla Bla Bla [Test1]</a><a href="url2.com">Bla Bla Bla [Test2]</a><a href="url3.com">Bla Bla Bla [Test3]</a>' 
      url2.com
      
      $ sed -E 's/.*[[:blank:]]href="([^"]+)"[^[]+\[Test2\].*/\1/' <<<'<a href="url1.com">Bla Bla Bla [Test1]</a><a href="url2.com">Bla Bla Bla [Test2]</a><a href="url3.com">Bla Bla Bla [Test3]</a>'
      url2.com
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多