【问题标题】:grep all characters including newlinegrep 所有字符,包括换行符
【发布时间】:2018-12-08 00:06:35
【问题描述】:

我正在用

解析一个 XML 文件
"lalala it's a Sunday {{ Some words here, maybe
a new line }} oh boy"

如果 grep . 字符无法识别换行符,我将如何使用 grep 获取“{{”和“}}”中的所有内容?

目前我有

grep '{{.*}}'

但它只适用于同一行的东西。

【问题讨论】:

    标签: regex grep


    【解决方案1】:

    一种选择是删除换行符,然后 grep,如下所示:

     cat myfile | tr -d '\n' | grep {{.*}}
    

    但如果你说这是一个 XML 文件,为什么不使用利用文件固有结构的 XML 解析器而不仅仅是正则表达式呢?

    编辑

    grep 正则表达式比较贪心,可以使用 perl 正则表达式:

    cat myfile | tr -d '\n' | perl -pe 's/.*?({{.*?}})/\1\n/g' | grep {{
    

    这应该每行输出一个匹配项。如果你嵌套了 {{ 那么这将变得更加复杂。

    【讨论】:

    • 它执行 cat 但现在 grep 不起作用 - 它返回整个文件。什么给了?
    【解决方案2】:

    这就是我解决这个问题的方法

       grep '{{[\s\S]*}}'
    

    【讨论】:

    • \s\S 是 PCRE 扩展,在标准 grep 中不可用。
    【解决方案3】:

    您可以使用互斥字符集之间的交替来真正匹配任何字符。比如这个命令:

    grep -E "\{\{([[:digit:]]|[^[:digit:]])+\}\}"
    

    ...将匹配第一个 {{ 和最后一个 }} 之间的任何内容(贪婪地)。

    但正如@JesseCohen 所说,您真的、真的、真的应该使用 XML 解析器 not regexps 解析 XML。

    【讨论】:

    • 如果您必须知道,我正在尝试提取包含非结构化数据的维基百科转储 XML 文件的部分内容(以上所有内容都可能包含在 <text xml:space="preserve"> 中)。所以我认为这里的 XML 解析不太相关。
    • 哇,我就是这么做的(维基百科转储的事情)。你可能会发现它比看起来要困难得多(至少我是这样)。
    • 此外,我认为使用 XML 解析器需要一次加载所有文件,并且 Wiki 转储是巨大的。
    • @Noam 如果它是流式 SAX 解析器,则不是,例如nokogiri.org/Nokogiri/XML/SAX.html
    【解决方案4】:

    这对我有用:

    grep -zo '[[:cntrl:][:print:]]'
    

    【讨论】:

      猜你喜欢
      • 2015-11-07
      • 1970-01-01
      • 1970-01-01
      • 2016-09-18
      • 2011-03-14
      • 1970-01-01
      • 1970-01-01
      • 2014-04-27
      相关资源
      最近更新 更多