![使用 sed、awk 或 grep 进行多行模式匹配](https://linux22.com/image/882/%E4%BD%BF%E7%94%A8%20sed%E3%80%81awk%20%E6%88%96%20grep%20%E8%BF%9B%E8%A1%8C%E5%A4%9A%E8%A1%8C%E6%A8%A1%E5%BC%8F%E5%8C%B9%E9%85%8D.png)
是否可以使用sed
,awk
或进行多行模式匹配grep
?举个例子,我想得到{
和之间的所有线条}
所以应该可以匹配
1. {}
2. {.....}
3. {.....
.....}
最初该问题<p>
用作示例。编辑问题以使用{
and }
。
答案1
虽然我同意上面的建议,即您希望获得一个解析器来处理任何比小型或完全临时的解析器,但(几乎;-)可以使用 sed 匹配大括号之间的多行块。
这是 sed 代码的调试版本
sed -n '/[{]/,/[}]/{
p
/[}]/a\
end of block matching brace
}' *.txt
一些笔记,
- -n 表示“处理时没有默认打印行”。
- 'p' 的意思是现在打印该行。
- 该构造
/[{]/,/[}]/
是一个范围表达式。这意味着扫描直到找到与第一个模式匹配的内容(/[{]/)
,然后扫描直到找到第二个模式(/[}]/)
然后执行在 sed 代码中的 { } 之间找到的任何操作。在本例中是“p”和调试代码。 (此处未解释,请使用它、修改它或将其取出,以最适合您的方式)。
当您满意地证明代码确实匹配由 {,} 分隔的块时,您可以删除块调试的 /[}]/a\ 结尾。
此代码示例将跳过不在花括号对内的任何内容。正如上面其他人所指出的,如果您在字符串、reg-exps 等中嵌入了任何额外的 {,} ,它会很容易混淆,OR 右大括号在同一行,(感谢 Fred.bear)
我希望这有帮助。
答案2
您可以对 pcregrep 使用 -M(多行)选项:
pcregrep -M '\{(\s*.*\s*)*\}' test.txt
\s 是空格(包括换行符),因此它匹配零次或多次出现的(空格后跟 .* 后跟空格),全部用大括号括起来。
更新:
这应该进行非贪婪匹配:
pcregrep -n -M '\{(\n*.*?\n*)*?\}' test.txt
答案3
类似 XML 的表达式(无限递归标签)不是“常规语言”,因此无法使用正则表达式 (regex) 进行解析。原因如下:
https://stackoverflow.com/questions/1732348/regex-match-open-tags- except-xhtml-self-contained-tags/
http://www.perlmonks.org/?node_id=668353
https://stackoverflow.com/questions/1379524/textual-protocol-which-is-not-a-regular-language
答案4
正则表达式找不到匹配的嵌套括号。
如果您确定正在搜索的括号内不会嵌套一对括号,则可以搜索直到第一个结束括号。例如:
sed -r 's#\{([^}])\}#\1#'
这将从“{”到“}”之间的所有文本替换为它们之间的内容。