VIM заменить шаблон - PullRequest
       0

VIM заменить шаблон

0 голосов
/ 06 августа 2010
  <created>
    pat@c.com 
  </created>

Я хочу заменить вышеперечисленное на, но имя пользователя может отличаться, т. Е. Pat @ c.com, harry @ c.com ...

      <created>
       tom@c.com
     </created>

Какая команда должна заменить это в vim

       %s/<created>\r*\r</created>/new string

1 Ответ

5 голосов
/ 06 августа 2010

Это зависит от того, какое форматирование вы хотите, но для конкретного примера, который вы цитируете, вы можете сделать одно из следующих:

Действительно просто, без контекста: замените pat@c.com на tom @ c.com

:%s/pat@c\.com/tom@c.com/g

С контекстом

:%s:<created>\s*\n\s*\zs.\{-}\ze@c\.com\s*\n\s*</created>:tom

В порядке объяснения:

:%s:XXX:YYY - Substitute XXX with YYY over the whole file (using colons as delimiters to avoid having to escape slashes or @s with a backslash)

where XXX is:
<created> - literal text to search for
\s*       - soak up any spaces or tabs to the end of the line
\n        - a new line character
\s*       - soak up any spaces or tabs at the start of the line
\zs       - special code that says "the match starts here", so only the bit between this and the \ze are actually replaced
.\{-}     - catch any characters, as few as possible - this will match 'pat' in the example above
\ze       - end of the bit we're changing
@c        - literal text - the @ and the start of the domain name
\.        - '.' means any character, so to match a literal dot, you must escape it
com       - literal text - the end of the email address
\s*       - any spaces/tabs to the end of the line
\n        - a new line character
\s*       - any spaces/tabs
</created> - literal match on the terminator (works because we don't use '/' as the delimiters)

and YYY is just the literal string "tom" to insert

Альтернативное образование:

:%s:<created>\_s*\zs\S\+\ze\_s*</created>:tom@c.com

:%s:XXX:YYY: - as before

where XXX is:

<created>  - literal text to search for
\_s*       - search for zero or more white-space characters, including new-lines (hence the underscore)
\zs        - as before, this is the start of the bit we want to replace (so we're not changing the <created> bit)
\S\+       - one or more non-whitespace characters (\+ is one or more, * is zero or more) - this should catch the whole email address
\ze        - as before, the end of the match
\_s*       - zero or more white-space characters
</created> - the end delimiter

YYY is then the whole email address.

Iнадеюсь, что это даст вам некоторую полезную информацию.В Интернете есть много полезных справочных руководств по регулярным выражениям (каковым они и являются) (хотя учтите, что Vim использует немного другой формат для большинства: \+ вместо + и т. Д.).Я настоятельно рекомендую прочитать:

:help pattern.txt

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

/<created>\_s*\zs\S\+\ze\_s*<\/created>

Обратите внимание, что перед префиксом / используется обратная косая черта в качественачало поиска /.Умный трюк с этим заключается в том, что :s по умолчанию использует последний поиск, так что вы можете набрать строку выше (/<created>\_s*\zs\S\+\ze\_s*<\/created>) и подправить ее, пока она не станет правильной, затем просто сделать :%s::tom@c.com, и так как бит, отмеченный XXX вышеотсутствует, он будет использовать ваш последний поиск и просто работать!

Если есть какие-то биты, которые вы не понимаете, :help ваш друг.Например, чтобы узнать о \zs, введите:

:help \zs

Для получения информации о \_s введите:

:help \_s

Для получения общей информации о :s введите:

:help :s

и т.д ...

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