【问题标题】:How to get only part of a line using grep/sed/awk with regex?如何使用带有正则表达式的 grep/sed/awk 仅获取一行的一部分?
【发布时间】:2016-09-02 12:13:15
【问题描述】:

我有一个 HTML 文件,我只需要获取其中的特定部分。这里最大的挑战是这个 HTML 文件没有换行符,所以我的 grep 表达式不能正常工作。

这是我的 HTML 文件:

<a href="/link1" param1="data1_1" param2="1_2"><p>Test1</p></a><a href="/link2" param1="data1_1" param2="1_2"><p>Test2</p></a>

请注意,我在这条线上有两个锚点 (&lt;a&gt;)。

我想获得第二个锚点,我正在尝试使用它:

cat example.html | grep -o "<a.*Test2</p></a>"

不幸的是,这个命令返回整行,但我只想要:

<a href="/link2" param1="data1_1" param2="1_2"><p>Test2</p></a>

我不知道如何使用 grep 或 sed 执行此操作,非常感谢任何帮助。

【问题讨论】:

  • 使用 XML/HTML 解析器(xmllint、xmlstarlet ...)。

标签: shell awk sed scripting grep


【解决方案1】:

应该这样做:

grep -o '<a[^>]*><p>Test2</p></a>' example.html

【讨论】:

    【解决方案2】:

    使用 Perl:

    $ perl -pe '@a = split(m~(?<=</a>)~, $_);$_ = $a[1]' file
    <a href="/link2" param1="data1_1" param2="1_2"><p>Test2</p></a>
    

    细分:

    perl -pe '                                       ' # Read line for line into $_
                                                       # and print $_ at the end
                         m~(?<=</a>)~                  # Match the position after
                                                       # each </a> tag
              @a = split(            , $_);            # Split into array @a
                                           $_ = $a[1]  # Take second item
    

    【讨论】:

      【解决方案3】:

      对于多字符 RS 的 GNU awk,如果它是您想要的第二条记录:

      $ awk 'BEGIN{RS="</a>"; ORS=RS"\n"} NR==2' file
      <a href="/link2" param1="data1_1" param2="1_2"><p>Test2</p></a>
      

      或者如果是标记为“Test2”的记录:

      $ awk 'BEGIN{RS="</a>"; ORS=RS"\n"} /<p>Test2<\/p>/' file
      <a href="/link2" param1="data1_1" param2="1_2"><p>Test2</p></a>
      

      或:

      $ awk 'BEGIN{RS="</a>"; ORS=RS"\n"; FS="</?p>"} $2=="Test2"' file
      <a href="/link2" param1="data1_1" param2="1_2"><p>Test2</p></a>
      

      【讨论】:

        猜你喜欢
        • 2013-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-06
        • 2017-11-14
        • 1970-01-01
        • 2017-04-13
        相关资源
        最近更新 更多