【问题标题】:grep only the first match in a line with regular expressiongrep 仅使用正则表达式的一行中的第一个匹配项
【发布时间】:2017-10-09 15:38:40
【问题描述】:

我有一些 xml 文件,我想在将它们解析为 Python 中的 csv 文件之前进行一些预处理(内存问题)。

假设我想从像

这样的 xml 文件中 grep 标题包含“abcd”的内容
<Title> Project abcd </Title> <Id> xxxx</Id> <Group>xxxx</Group>... <Title> Project abcd </Title>

由于重复的标题字段,如果我这样做了

grep -Ei "<Title>.*abcd.* </Title>"

如果“abcd”恰好包含在Id或其他不相关的字段中,它将返回该行。

有没有一种方法可以使用 grep 来返回只有 Title 字段包含我要查找的模式的行?

【问题讨论】:

    标签: linux grep pattern-matching


    【解决方案1】:

    你应该知道通过正则表达式解析 html/xml 的风险。如果你必须这样做, 试试

    '<Title>[^<]*abcd[^<]*</Title>'
    

    【讨论】:

    • 谢谢,这正是我现在需要的。虽然我不知道风险,但我会在未来的项目中学习使用 xml 解析器。
    【解决方案2】:

    使用 xml/html 解析器是操作 xml/html 数据的正确方法:

    xmlstarlet解决方案:

    xmlstarlet sel -t -c "//Title[contains(text(),"abcd")]" -n your.xml
    

    输出(用于您当前的输入):

    <Title> Project abcd </Title><Title> Project abcd </Title>
    

    【讨论】:

      猜你喜欢
      • 2017-11-17
      • 2013-12-01
      • 1970-01-01
      • 2017-02-25
      • 1970-01-01
      • 2011-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多