vim: заменить шаблон, который включает специальные символы и шаблоны, охватывающие несколько строк

#vim #replace #special-characters

#vim #заменить #специальные символы

Вопрос:

Я хочу заменить несколько материалов:

Мой исходный файл имеет:

 <regSetting>
  <registerAddr>0x0112</registerAddr>
  <registerData>0x0A</registerData>
</regSetting>
<regSetting>
  <registerAddr>0x0113</registerAddr>
  <registerData>0x0A</registerData>
</regSetting>
  

Я хочу заменить 3 элемента:

1-й фрагмент:

 <regSetting>
      <registerAddr>
  

чтобы получить:

 reg_write(
  

2-й фрагмент:

 </registerAddr>
<registerData>
  

Чтобы получить:

 ,
  

3-й фрагмент:

 </registerData>
</regSetting>
  

Чтобы получить:

 );
  

Чтобы, наконец, получить:

 reg_write(0x0112, 0x0A);
reg_write(0x0113, 0x0A);
  

Это легко заменяется, если мы используем notepad . Поскольку у нас есть опция без регулярных выражений, где поиск также может включать новые строки, он может найти все точные соответствия и заменить.

Я пробовал в Vim, но опция замены vim работает построчно. и я не смог найти подходящих ответов.

Это одно из таких требований, и аналогично у меня есть несколько замен, которые необходимо выполнить. Если это возможно в Vim, я хочу вырвать фрагмент и использовать его в приведенной ниже команде (заменить)

 %s/ctrl "/new_word/g
  

Ответ №1:

вы можете выполнять поиск и замену по нескольким строкам в vim, см. раздел Поиск по нескольким строкам.

для выполнения своей задачи вы можете использовать, например:

 %s/^s*<regSetting>_s*<registerAddr>(.*)</registerAddr>_s*<registerData>(.*)</registerData>_s*</regSetting>/reg_write(1, 2);/g
  

это длинно, но, я думаю, легко читается. в основном он соответствует всему <regSetting> тегу и содержимому и фиксирует значения, затем заменяет совпадение, используя захваченные значения.

_s шаблон будет соответствовать пробелу (пробел или табуляция) или символу новой строки.

Комментарии:

1. Я знал о, s* но не _s* и s* можете ли вы предоставить какую-нибудь ссылку для поиска этих параметров регулярных выражений

2. Спасибо, это подходит для моего варианта использования. Было бы полезно, если бы вы могли дать подсказку о том, как продвигаться с визуальным выделением, включающим несколько строк, yank, а затем search / replace.

3. @ranjithkonaje ссылка, которую я предоставил в ответе, дает хорошее объяснение _x шаблонов, в противном случае, конечно, есть :help _s , но я нашел это слишком кратким. «визуальный выбор нескольких строк, перетаскивание, а затем поиск / замена» Я не уверен, что правильно понял ваш запрос, вы можете вставить выдернутые строки в «панель» поиска с помощью ctrl r 0 .