用匹配的表达式替换字符串

时间:2018-10-11 18:04:51

标签: regex perl awk sed

我在多个文件Hello{Some Text}中包含以下文本,我想用Some Text替换它。 Some Text可能包含平衡括号{ }。例如:Hello{Some { other} Text}应替换为Some { other} Text

sedawkperl或其他工具中是否有简单的方法来实现这一目标?

1 个答案:

答案 0 :(得分:3)

您必须选择perl,因为它支持子例程调用。 {[^{}]*}上的递归匹配应该连续发生,并且如果发现不平衡的括号,则应该失败。在正则表达式下面可以完成工作:

Hello({((?:[^{}]*+|(?1))*)})

请参见live demo here

注意:面对带逃脱的大括号时失败。

Perl:

$ echo 'Hello{Some { other} Text}' | perl -pe 's~Hello({((?:[^{}]*+|(?1))*)})~$2~g'
Some { other} Text

正则表达式细目:

Hello # Match `Hello`
( # Start of 1st capturing group
    { # Match `{`
    ( # Start of 2nd capturing group
        (?: # Start of non-capturing group
            [^{}]*+ # Match anything but `{` or `}` possessively
            | # Or
            (?1) # Recurs first group
        )* # End of NCG, repeat as much as possible
    ) # End of 2nd CP
    } # Match `}`
) # End of 1st CP