grep所有字符,包括换行符

时间:2011-02-20 17:28:41

标签: regex grep

我正在使用

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

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

目前我有

grep '{{.*}}'

但它只适用于同一行的事物。

4 个答案:

答案 0 :(得分:8)

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

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

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

修改

grep regexp很贪心,你可以使用perl regexp:

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

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

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

这对我有用:

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