将()的内容与嵌套()匹配的正则表达式

时间:2014-06-10 17:44:14

标签: regex bash pcre

我有一个凌乱的文本文件(由于内容的性质我无法粘贴它。)

在文件中我想匹配unnested括号中的内容。

以下是包含问题的示例:

a(b()c((d)e)f()g)h(i)

我需要的输出是:

(b()c((d)e)f()g)(i)

(基本上是最大括号中的所有内容,少于'a'和'h')

同样我无法发布实际内容,但上面的例子说明了我在原始文件中遇到的问题。

我正在从bash工作,我熟悉sed,grep,但不幸的是没有awk。 感谢

2 个答案:

答案 0 :(得分:3)

由于正则表达式会找到最长的匹配,因此您可以使用

\(.*\)

如果您关心嵌套并希望找到最外层,例如对于((a)) and (b))))您要查找((a))(b),那么这是您在技术上无法与正则表达式匹配的典型语法示例。

但是,因为您标记了帖子PCRE:

grep -P -o '(?xs)(?(DEFINE) (?<c>([^()]|(?&p))) (?<p>\((?&c)*\)))((?&p))'

答案 1 :(得分:0)

哈,我知道有一个很好的答案,但是发布了我想出的那个,以丰富思想的范围。 (demo)。

(?x)
(?(DEFINE)(?<nest>(\((?:[^()]*(?1)?[^()]*)\))))
\((?:[^()]*(?&nest)?[^()]*)*\)

当然需要将其展平到grep行。