使用 sed、awk 或 grep 进行多行模式匹配

使用 sed、awk 或 grep 进行多行模式匹配

是否可以使用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

答案4

正则表达式找不到匹配的嵌套括号。

如果您确定正在搜索的括号内不会嵌套一对括号,则可以搜索直到第一个结束括号。例如:

sed -r 's#\{([^}])\}#\1#'

这将从“{”到“}”之间的所有文本替换为它们之间的内容。

相关内容