Добавление "/index.html" к путям в Vim - PullRequest
1 голос
/ 10 января 2011

Я пытаюсь добавить "/index.html" в некоторые пути к папкам в списке, например, так:

path/one/
/another/index.html
other/file/index.html
path/number/two
this/is/the/third/path/
path/five
sixth/path/goes/here/

Очевидно, что текст нужно добавлять только там, где его еще нет.Я мог бы добиться хороших результатов с (команда vim):

:%s/^\([^.]*\)$/\1\/index.html/

Единственная проблема заключается в том, что после выполнения этой команды некоторые строки, такие как 1-я, 5-я и 7-я в предыдущем примере, заканчиваются дублирующими косыми чертами.Это тоже легко решить, все, что мне нужно сделать, это искать дубликаты и заменять их одиночными слешами.

Но вопрос в том, не существует ли лучшего способа добиться правильного результата сразу?

Я новичок в Vim, а также не владелец регулярных выражений.Любые советы действительно приветствуются!

Спасибо!

Ответы [ 2 ]

4 голосов
/ 10 января 2011

Так очень близко:)

Просто добавьте дополнительную косую черту в конце регулярного выражения:

\/\?

Затем вам нужно изменить оставшуюся часть шаблона на не жадное совпадение, чтобы он игнорировал косую черту. Синтаксис для не жадного совпадения в vim (заменив *):

\{-}

Итак, мы получаем:

:%s/^\([^\.]\{-}\)\/\?$/\1\/index.html/

(Не мешает быть в безопасности и избежать периода.)

1 голос
/ 10 января 2011

Регулярное выражение Vim поддерживает возможность сопоставления фрагмента текста foo, если он предшествует или не следует за каким-либо другим текстом bar без сопоставления bar, и это именно то, что вам нужно находясь в поиске. Здесь вы хотите сопоставить конец строки с необязательным /, но только если за / не следует index.html, а затем замените его на /index.html. Быстрый взгляд на помощь Vim говорит мне, \@<! именно то, что использовать. Это говорит Vim, что предыдущий атом должен быть в тексте, но не в том, что соответствует. После небольших экспериментов я получаю

:%s;/\?\(index\.html\)\@<!$;/index.html;
  1. Я использую ;, чтобы разграничить части команды :s, чтобы мне не пришлось экранировать / в выражении регулярного выражения или замене. В этой конкретной ситуации это не имеет большого значения.

  2. / является необязательным, и мы говорим так с \?.

  3. Нам нужно сгруппировать index.html вместе, потому что в противном случае наш специальный \@<! повлияет только на l, в противном случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...