2016-06-30 3 views
3

Там у меня есть текс файл, который содержит сервала пункты, как:Как я могу использовать Vim заменить все целые строки, которые соответствуют Regex

\paragraph{name1} 

... 

\paragraph{name2} 

... 

Теперь я хочу, чтобы заменить все «пункт» с пунктом, просто как:

\item 
... 

\item 
... 

, чтобы достичь этого я перепробовал много команд и, наконец, я использовал это: (обратите внимание, что я использовал «: с» до «Z:» как названия пункта)

**:% s/\\paragraph[{][a-z]:[}]/\\item/g** 

, и я думаю, что это не так красиво и эффективно. Я попытался сопоставить строку, содержащую «абзац», но почему-то заменяется только это слово. Теперь, когда я могу удалить все такие строки с

**:% g/_*paragraph_*/d** 

есть в любом случае лучше, чтобы выполнить замену таким же образом? (Или сказать, чтобы заменить все строки содержит определенное слово)

+1

Так '\ пункт {<что-то здесь>}' получил бы заменить только с '\ item'? Ваш ожидаемый результат не совсем ясен для меня. –

+0

Вы в порядке с макросами? Они выполняют ту же работу без использования сложного регулярного выражения. – SibiCoder

+0

@ Two-BitAlchemist Точно, что я хочу, это как: заменить всю строку содержит «абзац» на \ item (это целая строка) –

ответ

0

Простой способ общения с macro! Сначала найдите образец, используя / как /\paragraph

Давайте начнем макрос. Очистить регистр a, нажав qaq. Нажмите qa, чтобы начать запись в регистре a. Нажмите n, чтобы войти в него. Затем нажмите c$, чтобы удалить до конца строки и вставить текст. Затем введите текст и нажмите клавишу escape.

Нажмите @a, чтобы повторить процесс.Завершить макрос, нажав q.

Теперь макрос записывается, и вы можете нажать @a один раз, чтобы внести изменения во все такие строки.

+0

Это хорошая идея, я так не думал. Но я думаю, что, возможно, это занимает много времени, если их насчитывается более 50 таких строк? –

+0

Требуется секунда или два. Вы должны выполнить макросы, вы влюбитесь в них;) – SibiCoder

+1

wow это потрясающе! –

1

Вашей первую попытку было почти правильным. Вместо этого

:% s/\paragraph[{][a-z]:[}]/\item/g 

Используйте этот

:% s/^\\paragraph{[a-z|0-9]\+}$/\\item/g 

Давайте разбить его по частям:

  1. ^ символ соответствует началу строки, так что вы не t t примерно следующее:

    Some text \paragraph{abc}

  2. Причина, почему мы используем \\ вместо \ потому, что \ является маскирующим, так, чтобы соответствовать этому, мы избегаем экранирующего символа.

  3. Выполнение [a-z|0-9]\+ будет соответствовать одному или нескольким символам a-z или 0-9, что я и предполагаю, что ваши имена абзацев состоят из. Если вам нужны заглавные буквы, вы можете сделать что-то вроде [a-zA-Z|0-9]\+.

  4. Наконец, мы привязываем выражение к концу строки с $, так что оно не соответствует строкам, которые не соответствуют этому шаблону.

+0

'[az | 0-9]' это то же самое, что '[a-z0- 9 |] ': он соответствует строчной букве или цифре или' | '. – melpomene

+0

Если ваше регулярное выражение так привязано, '/ g' не имеет значения. – melpomene

+0

В этом случае он работает, спасибо. Но мой вопрос: если я не спросил ясно, как заменить более длинную и сложную строку, содержащую конкретное слово, например «абзац» здесь? –

0

Вы можете сделать это:

:%s/\\paragraph{[^{}]*}/\\item/g 

Это находит все вхождения \paragraph{, за которой следует 0 или более не- {} символов, за которыми следуют } (то есть что-то вроде \paragraph{stuff here}), и заменяет их на \item.


Или, если вы хотите заменить все строки, содержащие paragraph:

:%s/^.*paragraph.*$/\\item/ 
+0

Он работает и лучше, чем мой. Но все же, я хочу узнать, как описать сложную линию в короткие сроки. –