Поскольку вы используете Vim, альтернативой является запись макроса клавиатуры для этого в регистр, например register z.
- Начать запись с
qz
.
- Искать вперед ENDPROGRAM:
/ENDPROGRAM[enter]
- вперед сканирование для открытия скобки:
f{
- Удалить для сопоставления скобки:
d%
- Конца запись
q
.
Теперь запустите макрос @z
, а затем повторите с @@
. Удерживайте клавишу @
, чтобы быстро повторить.
Для одноразовых работ, не связанных с десятками тысяч изменений в многочисленных файлах, такой интерактивный подход работает хорошо. Вы наглядно подтверждаете, что все правильно. Дело в том, что даже если вы полностью автоматизируете его с помощью регулярных выражений, вам все равно придется смотреть на каждое изменение, чтобы подтвердить, что правильная вещь была сделана до того, как она совершила код.
Первая ошибка в вашем регулярном выражении заключается в том, что материал между фигурными скобками должен быть только буквой и цифрами. (Я предполагаю, что 0-0 - опечатка для 0-9). Обратите внимание, что между брекетами, такими как пробелы и круглые скобки, есть другие вещи. Вы хотите, чтобы {.*}
: открытая фигурная скобка, за которой следует ноль или более символов, а затем закрывающая фигурная скобка. Если так получится, что у вас есть варианты, например ENDPROGRAM { abc } { def }
, это регулярное выражение тоже их съест. Регулярное выражение совпадает с первой открытой фигурной скобкой до последней закрывающей. Также обратите внимание, что регулярное выражение {[^}]*}
не будет работать, если блок содержит вложенные внутренние фигурные скобки; он останавливается на первой закрывающей скобе, а не на последней, и поэтому ENDPROGRAM { { x } }
превратится в ENDPROGRAM }
.
Вторая ошибка заключается в том, что вы используете это для всех линий, используя адрес %
. Вы только хотите, чтобы запустить это на линиях, которые содержат ENDPROGRAM
, другими словами:
:g/ENDPROGRAM/s/ {.*}//
«Для всех строк, содержащих совпадение для ENDPROGRAM
, найти пробел, затем какой-то текст в квадратных скобках, и заменить его ничем."Или еще:
:%s/ENDPROGRAM {.*}/ENDPROGRAM/
's/\ {[^}] * \} // g' –
Фактически:' s/{[^}] *} // g' i не думаю, что скобки должны быть экранированы. также .. это работает только если это на 1 строке. –
@CrayonViolent Он также работает только в том случае, если блок не имеет вложенных брекетов. Вам просто нужно '{. *}'. – Kaz