2014-02-21 4 views
0

В моем коде я хочу удалить блок кода, который начинается с скобки и заканчивается скобкой. Например, если у меня есть эта линияРегулярное выражение Vim для удаления блока кода для всех строк

ENDPROGRAM { fprintf(sdfsdfsdfsd....) } 

и после запуска регулярных выражений я хочу, чтобы это просто в конечном итоге с

ENDPROGRAM 

Я хочу, чтобы удалить только код внутри кронштейна и сами скобки. Я пробовал эту команду

:%s/\{[a-zA-Z0-0]*\}//g 

но он говорит, что шаблон не найден. Любое предложение? ENDPROGRAM - это просто пример, у меня есть DIV MULT и т. Д.

+2

's/\ {[^}] * \} // g' –

+0

Фактически:' s/{[^}] *} // g' i не думаю, что скобки должны быть экранированы. также .. это работает только если это на 1 строке. –

+1

@CrayonViolent Он также работает только в том случае, если блок не имеет вложенных брекетов. Вам просто нужно '{. *}'. – Kaz

ответ

2

Поскольку вы используете Vim, альтернативой является запись макроса клавиатуры для этого в регистр, например register z.

  1. Начать запись с qz.
  2. Искать вперед ENDPROGRAM: /ENDPROGRAM[enter]
  3. вперед сканирование для открытия скобки: f{
  4. Удалить для сопоставления скобки: d%
  5. Конца запись q.

Теперь запустите макрос @z, а затем повторите с @@. Удерживайте клавишу @, чтобы быстро повторить.

Для одноразовых работ, не связанных с десятками тысяч изменений в многочисленных файлах, такой интерактивный подход работает хорошо. Вы наглядно подтверждаете, что все правильно. Дело в том, что даже если вы полностью автоматизируете его с помощью регулярных выражений, вам все равно придется смотреть на каждое изменение, чтобы подтвердить, что правильная вещь была сделана до того, как она совершила код.

Первая ошибка в вашем регулярном выражении заключается в том, что материал между фигурными скобками должен быть только буквой и цифрами. (Я предполагаю, что 0-0 - опечатка для 0-9). Обратите внимание, что между брекетами, такими как пробелы и круглые скобки, есть другие вещи. Вы хотите, чтобы {.*}: открытая фигурная скобка, за которой следует ноль или более символов, а затем закрывающая фигурная скобка. Если так получится, что у вас есть варианты, например ENDPROGRAM { abc } { def }, это регулярное выражение тоже их съест. Регулярное выражение совпадает с первой открытой фигурной скобкой до последней закрывающей. Также обратите внимание, что регулярное выражение {[^}]*} не будет работать, если блок содержит вложенные внутренние фигурные скобки; он останавливается на первой закрывающей скобе, а не на последней, и поэтому ENDPROGRAM { { x } } превратится в ENDPROGRAM }.

Вторая ошибка заключается в том, что вы используете это для всех линий, используя адрес %. Вы только хотите, чтобы запустить это на линиях, которые содержат ENDPROGRAM, другими словами:

:g/ENDPROGRAM/s/ {.*}// 

«Для всех строк, содержащих совпадение для ENDPROGRAM, найти пробел, затем какой-то текст в квадратных скобках, и заменить его ничем."Или еще:

:%s/ENDPROGRAM {.*}/ENDPROGRAM/ 
1

это выглядит как работа для:.(! Дум да дум duuuuum)

ТЕКСТ ОБЪЕКТЫ

Поместите курсор в любом месте внутри скобок типа дВ.

WOOOOOOOAAAH что только что произошло ?!

aB - это нечто, называемое «текстовым объектом» в Виме. В этой ситуации вы также можете ввести da{ или da}. Текстовым объектом является вещь, что операторы Vim могут действовать. d является одним из таких операторов. Я уверен, что вы знаете другие: гр, Y и т.д.

Визуальный режим работает на текстовых объектов. Вместо daB попробуйте vaB. Это позволит выбрать весь текст в фигурных скобках, а также сами фигурные скобки. Большинство текстовых объектов также имеют «внутренний» вариант, например ciB удаляет все внутри фигурных скобок и вводит режим вставки, оставляя фигурные скобки неповрежденными.

Есть текстовые объекты для работы с тегами HTML/XML, объекты для работы с цитируемыми строками, объекты для предложений и абзацев, объекты для слов и СЛОВА и многое другое. См. Полный список: :help text-objects.

2

Когда что-то сломано, начинайте с простого и работайте над тем, что вам нужно. Не беспокойтесь о команде :s; вместо этого сосредоточьтесь на правильном выборе шаблона (или регулярного выражения).

  1. Поиск \{, и вы получите сообщение об ошибке. К сожалению, это должно быть только {.
  2. Добавить класс символов: {[a-zA-Z0-0]*. Да, это неправильно, потому что ты забыл это пространство.
  3. Следующая попытка: {[a-zA-Z0-0 ]*. Теперь мы куда-то попадаем, но мы также хотим сопоставить круглые скобки и точки: {[a-zA-Z0-0().]*.
  4. Добавить закрывающую скобу, понять, что вы действительно имели в виду 0-9 вместо 0-0, и все готово: {[a-zA-Z0-9().]*}.

На данный момент, вы можете воспользоваться тем, что :s использует текущий шаблон поиска по умолчанию, поэтому все, что вам нужно, это :%s///.

Смежные вопросы