【发布时间】:2018-12-08 00:06:35
【问题描述】:
我正在用
解析一个 XML 文件"lalala it's a Sunday {{ Some words here, maybe
a new line }} oh boy"
如果 grep . 字符无法识别换行符,我将如何使用 grep 获取“{{”和“}}”中的所有内容?
目前我有
grep '{{.*}}'
但它只适用于同一行的东西。
【问题讨论】:
我正在用
解析一个 XML 文件"lalala it's a Sunday {{ Some words here, maybe
a new line }} oh boy"
如果 grep . 字符无法识别换行符,我将如何使用 grep 获取“{{”和“}}”中的所有内容?
目前我有
grep '{{.*}}'
但它只适用于同一行的东西。
【问题讨论】:
一种选择是删除换行符,然后 grep,如下所示:
cat myfile | tr -d '\n' | grep {{.*}}
但如果你说这是一个 XML 文件,为什么不使用利用文件固有结构的 XML 解析器而不仅仅是正则表达式呢?
编辑
grep 正则表达式比较贪心,可以使用 perl 正则表达式:
cat myfile | tr -d '\n' | perl -pe 's/.*?({{.*?}})/\1\n/g' | grep {{
这应该每行输出一个匹配项。如果你嵌套了 {{ 那么这将变得更加复杂。
【讨论】:
这就是我解决这个问题的方法
grep '{{[\s\S]*}}'
【讨论】:
\s 和 \S 是 PCRE 扩展,在标准 grep 中不可用。
您可以使用互斥字符集之间的交替来真正匹配任何字符。比如这个命令:
grep -E "\{\{([[:digit:]]|[^[:digit:]])+\}\}"
...将匹配第一个 {{ 和最后一个 }} 之间的任何内容(贪婪地)。
但正如@JesseCohen 所说,您真的、真的、真的应该使用 XML 解析器 not regexps 解析 XML。
【讨论】:
<text xml:space="preserve"> 中)。所以我认为这里的 XML 解析不太相关。
这对我有用:
grep -zo '[[:cntrl:][:print:]]'
【讨论】: