【问题标题】:Use regex to retrieve string between characters使用正则表达式检索字符之间的字符串
【发布时间】:2013-03-14 22:06:43
【问题描述】:

我想使用grep 命令或只知道regex 来获取“>”和“

字符串:

<f id=mos-title>demo-break-1</f>

我想回来

demo-break-1

【问题讨论】:

标签: regex linux unix grep


【解决方案1】:

假设文件foo 包含:

<f id=mos-title>demo-break-1</f>
<f id=mos-title>demo-break-2</f>
<f id=mos-title>demo-break-3</f>
<a>foo testing</a>

你可以这样做:

perl -ne 'print "$1\n" if /<.+id=mos-title>(.+?)<\/f>/' foo

请记住,如果这些匹配只出现在一行上,那将是严格的。此外,您必须考虑格式中的任何偏差,因为这不是有效的 HTML 解析器。

就严格而言,这是一种更宽松的方法,但仍不是 100% 兼容 HTML。

perl -ne 'print "$1\n" if /<.+id=mos-title\b.*?>\s*(.+?)\s*<\/f>/' foo

输出如下:

demo-break-1
demo-break-2
demo-break-3

【讨论】:

    【解决方案2】:

    如果你有这样一个合适的 xml 文档:

    <root>
      <f id="mos-title">demo-break-1</f>
    </root>
    

    您可以使用适当的解析器:

    xmllint --xpath "/root/f[@id='mos-title']" input.xml | \
          sed 's/[^>]*>\([^<]*\)<[^>]*>/\1\n/g'
    

    根据您的输入,如果您确定输入格式是一致的(即生成的),您可以使用 sed:

    sed 's/[^>]*>\([^<]*\)<[^>]*>/\1/g' input
    

    【讨论】:

      【解决方案3】:

      通常最好使用 XML 解析器,但你可以试试这个 awk:

      awk '$1==s{print $2}' s="f id=mos-title" RS=\< FS=\> file
      

      【讨论】:

        猜你喜欢
        • 2016-03-05
        • 1970-01-01
        • 2020-10-19
        • 1970-01-01
        • 1970-01-01
        • 2017-09-28
        • 1970-01-01
        • 2013-12-26
        • 2017-04-15
        相关资源
        最近更新 更多