Заменить строку с соответствующим выражением - PullRequest
0 голосов
/ 11 октября 2018

У меня есть следующий текст в нескольких файлах Hello{Some Text}, и я хочу заменить его на Some Text.Где Some Text может включать сбалансированные скобки { }.Например: Hello{Some { other} Text} следует заменить на Some { other} Text.

Есть ли простой способ добиться этого в sed, awk, perl или другом инструменте?

1 Ответ

0 голосов
/ 11 октября 2018

Вы должны выбрать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...