Vim - Vi // Замена шаблона - PullRequest
       62

Vim - Vi // Замена шаблона

0 голосов
/ 24 декабря 2018

У меня есть XML-файл следующим образом:

<Word name="name1" WordID="...">
</Word>

Мне нужно вставить 2 дополнительных начальных пробела перед обеими такими строками во всем файле. Есть идеи?- Спасибо!

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

Альтернатива: глобальная команда.

Глобальные команды действуют на весь файл и выполняют действие (Ex) для каждой строки, соответствующей шаблону.Это вдохновение для grep (:global/re/print) и напоминает awk, если вы щурились.

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

Поскольку нам нужна команда Ex, мы используем :normal! для выполнения обычной команды без применения сопоставлений, а затем просто I вставляем два пробела в начале строки.

(я скопировал и отредактировал образец из N ответа Сарджа )

:global ~</\?[Ww]ord~ normal! I  

Обратите внимание на два пробела после I.

Здесь я использовал ~ в качестве разделителя шаблонов, потому что подойдет любой символ, а не использование стандартного / означало, что мне не нужно было избегать его в шаблоне.

Мы все еще должны экранировать ?, чтобы получить специальное значение «ноль или один» (в отличие от совпадения с литералом ?).

0 голосов
/ 24 декабря 2018

Попробуйте:

%s/^\(<\/*[Ww]ord.*\)$/  \1/

% означает весь файл.

s означает замену

^ означает начало строки

$ означает конец строки

<- угловая скобка </p>

. * Означает любой символ ноль или более раз

(и) заключает в себе регулярное выражение, которое вы хотите сохранить

\1 указывает, куда следует вставить сохраненное регулярное выражение.

После / и до \1 вы вставляете столько пробелов, сколько хотите.

Когда вы пишете выражение между \(и \) записывается и может использоваться впоследствии с \N, где N - число.Например, здесь \1 означает соответствие первого выражения.Если у вас было \( и \) во второй раз, вы могли бы использовать \1 и \2 для включения первого и второго соответственно.

Например,

s/\(first\)\(second\)/\1 \2/

вставит пробел между словами первый и второй

...