我在多个文件Hello{Some Text}
中包含以下文本,我想用Some Text
替换它。 Some Text
可能包含平衡括号{ }
。例如:Hello{Some { other} Text}
应替换为Some { other} Text
。
在sed
,awk
,perl
或其他工具中是否有简单的方法来实现这一目标?
答案 0 :(得分:3)
您必须选择perl
,因为它支持子例程调用。 {[^{}]*}
上的递归匹配应该连续发生,并且如果发现不平衡的括号,则应该失败。在正则表达式下面可以完成工作:
Hello({((?:[^{}]*+|(?1))*)})
注意:面对带逃脱的大括号时失败。
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