Разное

Замена vim: vim замена текста с подстановкой

Содержание

О заменах в Vim, использующих регулярные выражения / Хабр

Привет, хабр! Ни для кого не секрет, что старина Vim очень хорош для решения разнообразнейшего круга проблем. Я бы хотел немного пописать об одной из составляющих, которые делают наш любимый редактор настолько мощным, насколько мощным он является — об инструментарии замен, использующем регулярные выражения. Свое повествование я планирую построить, рассказывая о том, как я решал пару специфических задач, и дополняя этот рассказ некоторыми базовыми справочными сведениями.


С одной стороны, про все это есть подробнейший хелп, доступный по адресу :help usr_27.txt — оттуда и было почерпнуто все, о чем будет идти речь. С другой стороны, когда мне понадобилось решить описываемые задачи, я потратил на это значительное время. Это дает мне право надеяться на то, что мой текст будет все же полезен. Сразу хочу оговориться, что я человек, далекий от программирования, поэтому моя терминология может показаться странной или нелепой — прошу меня за это простить.

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

<'фраза'> -> ' ' (ничто).


Поиск и замена в Vim осуществляется командой :substitute, однако куда удобнее использовать для нее аббревиатуру :s. Общий синтаксис этой команды примерно такой:

:{пределы}s/{что заменяем}/{на что заменяем}/{опции}


Элемент {пределы} должен содержать область, в которой мы бы хотели, чтобы совершалась замена. Если опустить этот элемент, то поиск и замена будет произведен только в той строке, где располагается курсор. Для замены во всем файле можно использовать символ ‘%’. Для поиска и замены в области, начинающейся со строки l1 и заканчивающейся строкой l2, {пределы} должны иметь вид ‘l1,l2’, например :14,17s/ будет осуществлять поиск и замену в строках с 14-й по 17-ю. Отдельного упоминания заслуживают строка с курсором, номер которой символически обозначается точкой, и последняя строка, номер которой обозначается знаком доллара. Таким образом, для того, чтобы осуществить поиск от текущей строки до конца файла, используют команду ‘:.,$s/’.

Вся эта команда осуществляет в указанных пределах поиск последовательности, удовлетворяющей критериям элемента «что заменяем», и заменяет эту последовательность на последовательность символов, построенную по правилам элемента «на что заменяем», учитывая опции, указанные после последнего слеша.

Первая команда, которую я попробовал для решения своей задачи, была следующая

:%s/<.*>//g


До первого слеша идет команда поиска и замены во всем файле. Между первым и вторым слешами идет последовательность, которую Vim будет искать. Подробнее о ней.

Сначала идет треугольная скобка, Vim будет искать буквальное совпадение с ней. Точка обозначает любой символ, а звездочка обозначает вхождение предыдущего символа произвольное число раз — начиная с нуля и до бесконечности. Таким образом, последовательность ‘.*’ обозначает любую последовательность любых символов. Наконец, далее закрывающая треугольная скобка. Да, прошу прощения, если терминология «треугольных скобок» оскорбляет восприятие тех, кто помнит, что это знаки «меньше-больше» (:

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

Символ g, который завершает команду, обозначает поиск во всей строке. В противном случае Vim искал бы только первое совпадение в каждой из строк, входящих в {пределы}. Еще из полезных опций припоминаются опция ‘n’, которая осуществляет только поиск, но не заменяет (это помогает проверить, совпадают ли действительные критерии поиска с желаемыми), и ‘с’, которая спрашивает подтверждения перед каждым актом замены.

Итак, описанная команда осуществляет поиск последовательности, которая состоит из любых символов, заключенных в треугольные скобки.>]*>//g


Можно прикинуть, как решается такая задача в, скажем, блокноте, и в Vim. В блокноте я бы стал сначала массово заменять самые популярные теги на пустое место (например, первым бы запустил замену тега ‘p’ на пустое место), а потом стал бы искать треугольные скобки и удалять их и то, что внутри. На обработку действительно большого файла ушла бы у меня куча времени. А тут все получается одной командой — так просто.

Теперь еще об одной задаче — по долгу службы мне приходится пользоваться программой Wolfram Mathematica, которая на выходе дает много ASCII информации, которую, в свою очередь, требуется обработать для удобочитаемости. Например, отыскание абсолютной величины какого-то выражения эта программа обозначает словом ‘Abs’ и берет это выражение еще в квадратные скобки. Мне нравится читать математические тексты, пропущенные через Latex, и нахождение абсолютной величины совершенно естественно обозначать вертикальными палками (vertical bar). Так что мне нужно во всем файле совершить замену

Abs[ 'выражение' ] -> | 'выражение' |


Если бы надо было просто удалить все вхождения слова ‘Abs’, было бы совсем просто и аналогично предыдущей задаче, но в этом случае нам нужно еще и сохранить ‘выражение’, причем, каждый раз оно будет новым.; \* и т.д. Сам слеш предваряется также слешем. Выглядит это так: для поиска последовательности ‘\cos’ надо ввести ‘\\cos’.

Наконец, последняя задача, о которой я хотел бы написать. Та же Mathematica оперирует с множеством величин, которые обозначаются заглавной латинской буквой с числовым индексом, состоящим из одной цифры. В ASCII формате эти латинская буква и цифра просто идут подряд, например ‘U1’. Для того, чтобы Latex обработал бы их как букву с индексом, индекс надо предварить символом нижнего подчеркивания ‘_’. Обрисовывается задача — совершить замену вида

'Заглавная латинская буква''цифра' -> 'Заглавная латинская буква'_'цифра'


Самое тривиальное решение, которое напрашивается — перебрать все комбинации, если их немного. То есть, запустить замену сначала ‘U1’ -> ‘U_1’, потом ‘U2’ -> ‘U_2’ и т.п. Понятно, что это не наш метод. Мы вспомним, что есть квадратные скобки. И для того, чтобы найти одну заглавную латинскую букву, достаточно ввести шаблон ‘[A-Z]’. Но и это не предел. Для такого шаблона у Vim есть специальная аббревиатура: ‘\u’ (от ‘uppercase’). Для цифр же есть ‘\d’ (от ‘digit’). Подробнее о таких конструкциях можно почитать по адресу :help pattern.txt. С использованием этих аббревиатур команда для поиска примет вид

:%s/\(\u\)\(\d\)/\1_\2/g


Тут опять встречается группировка круглыми скобками: она позволяет при поиске поместить найденную букву и цифру в память под соотвествующими номерами, и впоследствии их оттуда извлечь, вызывая командами с теми же номерами: ‘\1’ вызовет букву, а ‘\2’ — цифру.

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

О заменах в Vim, использующих регулярные выражения / Хабр

Привет, хабр! Ни для кого не секрет, что старина Vim очень хорош для решения разнообразнейшего круга проблем. Я бы хотел немного пописать об одной из составляющих, которые делают наш любимый редактор настолько мощным, насколько мощным он является — об инструментарии замен, использующем регулярные выражения. Свое повествование я планирую построить, рассказывая о том, как я решал пару специфических задач, и дополняя этот рассказ некоторыми базовыми справочными сведениями.


С одной стороны, про все это есть подробнейший хелп, доступный по адресу :help usr_27.txt — оттуда и было почерпнуто все, о чем будет идти речь. С другой стороны, когда мне понадобилось решить описываемые задачи, я потратил на это значительное время. Это дает мне право надеяться на то, что мой текст будет все же полезен. Сразу хочу оговориться, что я человек, далекий от программирования, поэтому моя терминология может показаться странной или нелепой — прошу меня за это простить.

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

<'фраза'> -> ' ' (ничто).


Поиск и замена в Vim осуществляется командой :substitute, однако куда удобнее использовать для нее аббревиатуру :s. Общий синтаксис этой команды примерно такой:

:{пределы}s/{что заменяем}/{на что заменяем}/{опции}


Элемент {пределы} должен содержать область, в которой мы бы хотели, чтобы совершалась замена. Если опустить этот элемент, то поиск и замена будет произведен только в той строке, где располагается курсор. Для замены во всем файле можно использовать символ ‘%’. Для поиска и замены в области, начинающейся со строки l1 и заканчивающейся строкой l2, {пределы} должны иметь вид ‘l1,l2’, например :14,17s/ будет осуществлять поиск и замену в строках с 14-й по 17-ю. Отдельного упоминания заслуживают строка с курсором, номер которой символически обозначается точкой, и последняя строка, номер которой обозначается знаком доллара. Таким образом, для того, чтобы осуществить поиск от текущей строки до конца файла, используют команду ‘:.,$s/’.

Вся эта команда осуществляет в указанных пределах поиск последовательности, удовлетворяющей критериям элемента «что заменяем», и заменяет эту последовательность на последовательность символов, построенную по правилам элемента «на что заменяем», учитывая опции, указанные после последнего слеша.

Первая команда, которую я попробовал для решения своей задачи, была следующая

:%s/<.*>//g


До первого слеша идет команда поиска и замены во всем файле. Между первым и вторым слешами идет последовательность, которую Vim будет искать. Подробнее о ней.

Сначала идет треугольная скобка, Vim будет искать буквальное совпадение с ней. Точка обозначает любой символ, а звездочка обозначает вхождение предыдущего символа произвольное число раз — начиная с нуля и до бесконечности. Таким образом, последовательность ‘.*’ обозначает любую последовательность любых символов. Наконец, далее закрывающая треугольная скобка. Да, прошу прощения, если терминология «треугольных скобок» оскорбляет восприятие тех, кто помнит, что это знаки «меньше-больше» (:

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

Символ g, который завершает команду, обозначает поиск во всей строке. В противном случае Vim искал бы только первое совпадение в каждой из строк, входящих в {пределы}. Еще из полезных опций припоминаются опция ‘n’, которая осуществляет только поиск, но не заменяет (это помогает проверить, совпадают ли действительные критерии поиска с желаемыми), и ‘с’, которая спрашивает подтверждения перед каждым актом замены.

Итак, описанная команда осуществляет поиск последовательности, которая состоит из любых символов, заключенных в треугольные скобки. Vim попросту удалит каждую такую последовательность. К сожалению, эта команда не работает должным образом, поскольку между треугольными скобками она ищет любые символы. В том числе, другие треугольные скобки. Поэтому если в одной строке будет несколько пар треугольных скобок, Vim выберет последовательность, которая начинается с первой открывающей и заканчивается последней закрывающей треугольной скобкой.>]*>//g


Можно прикинуть, как решается такая задача в, скажем, блокноте, и в Vim. В блокноте я бы стал сначала массово заменять самые популярные теги на пустое место (например, первым бы запустил замену тега ‘p’ на пустое место), а потом стал бы искать треугольные скобки и удалять их и то, что внутри. На обработку действительно большого файла ушла бы у меня куча времени. А тут все получается одной командой — так просто.

Теперь еще об одной задаче — по долгу службы мне приходится пользоваться программой Wolfram Mathematica, которая на выходе дает много ASCII информации, которую, в свою очередь, требуется обработать для удобочитаемости. Например, отыскание абсолютной величины какого-то выражения эта программа обозначает словом ‘Abs’ и берет это выражение еще в квадратные скобки. Мне нравится читать математические тексты, пропущенные через Latex, и нахождение абсолютной величины совершенно естественно обозначать вертикальными палками (vertical bar). Так что мне нужно во всем файле совершить замену

Abs[ 'выражение' ] -> | 'выражение' |


Если бы надо было просто удалить все вхождения слова ‘Abs’, было бы совсем просто и аналогично предыдущей задаче, но в этом случае нам нужно еще и сохранить ‘выражение’, причем, каждый раз оно будет новым.; \* и т.д. Сам слеш предваряется также слешем. Выглядит это так: для поиска последовательности ‘\cos’ надо ввести ‘\\cos’.

Наконец, последняя задача, о которой я хотел бы написать. Та же Mathematica оперирует с множеством величин, которые обозначаются заглавной латинской буквой с числовым индексом, состоящим из одной цифры. В ASCII формате эти латинская буква и цифра просто идут подряд, например ‘U1’. Для того, чтобы Latex обработал бы их как букву с индексом, индекс надо предварить символом нижнего подчеркивания ‘_’. Обрисовывается задача — совершить замену вида

'Заглавная латинская буква''цифра' -> 'Заглавная латинская буква'_'цифра'


Самое тривиальное решение, которое напрашивается — перебрать все комбинации, если их немного. То есть, запустить замену сначала ‘U1’ -> ‘U_1’, потом ‘U2’ -> ‘U_2’ и т.п. Понятно, что это не наш метод. Мы вспомним, что есть квадратные скобки. И для того, чтобы найти одну заглавную латинскую букву, достаточно ввести шаблон ‘[A-Z]’. Но и это не предел. Для такого шаблона у Vim есть специальная аббревиатура: ‘\u’ (от ‘uppercase’). Для цифр же есть ‘\d’ (от ‘digit’). Подробнее о таких конструкциях можно почитать по адресу :help pattern.txt. С использованием этих аббревиатур команда для поиска примет вид

:%s/\(\u\)\(\d\)/\1_\2/g


Тут опять встречается группировка круглыми скобками: она позволяет при поиске поместить найденную букву и цифру в память под соотвествующими номерами, и впоследствии их оттуда извлечь, вызывая командами с теми же номерами: ‘\1’ вызовет букву, а ‘\2’ — цифру.

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

Поиск и замена в VIM

?

LiveJournal

  • Main
  • Ratings
  • Interesting
  • iOS & Android
  • Disable ads

Login

  • Login
  • CREATE BLOG

    Join

  • English

    (en)

    • English (en)
    • Русский (ru)
    • Українська (uk)
    • Français (fr)
    • Português (pt)
    • español (es)
    • Deutsch (de)
    • Italiano (it)
    • Беларуская (be)

Волшебные замены в Vim, много файлов

Хотим сделать замену, описываемую регулярным выражением, в большом количестве файлов сразу. Рассмотрим эту процедуру на примере добавления тэга в нескольких html-файлах (знать html не надо).

Допустим, решили вставить во все файлы tag <meta> такого вида:

1
<meta http-equiv="refresh" content="seconds; URL-redirect-to">

Это один из способов (плохой) для включения переадресации с адреса oldsite.ru/page_name на newsite.ru/page_name и с oldsite.ru/folder/page_name на newsite.ru/folder/page_name для каждой страницы. Иными словами, мы хотим, чтобы в каждом файле появилось некоторое выражение, зависящее от имени файла.

Заходим в директорию с нашими html-файлами. Запускаем vim и выполняем:

Рекурсивное открытие файлов из всех поддиректорий

Командой :ls убедитесь, что открыты все необходимые страницы. Теперь нужно решить, что будем менять. Перенаправляющий мета-tag надо поместить между <head> и </head>, поэтому неплохой идеей будет замена

на

1
2
<head>
<meta http-equiv="refresh" content="2; http://newsite.ru/page_name">

Для этого скопируем выражение выше в регистр, скажем, r (выделить + "ry). Уточняю: можно использовать именно page_name. Это просто шаблон, можно изменить его на что угодно, что не встречается на ваших страницах. Затем:

Меняем <head> на содержимое регистра r.

1
:argdo %s/<head>/\=@r/ge | update

В результате этой замены во всех файлах появится строка, содержащая шаблон page_name, который мы следующим действием заменим на реальное название файла. Содержимое регистра r вставляется выражением \=@r. Без команды «| update» vim не станет менять больше одного файла. Командой :ls можно проверить, в каких файлах изменение произошло, а в каких — нет: «line 0» говорит о том, что курсор в файле не перемещался, т.е. замен не происходило. Теперь меняем page_name на настоящее имя файла (регистр % хранит имя файла):

Регистр % всегда содержит имя файла.

1
:argdo %s/page_name/\=@%/ge | update

Вот, собственно, и всё. Тогда в файле abrikos.html, лежащем в корне, вместо <head> появится:

1
2
<head>
<meta http-equiv="refresh" content="2; http://newsite.ru/abrikos.html">

А в файле honduras.html из поддиректории countries вместо <head> появится:

1
2
<head>
<meta http-equiv="refresh" content="2; http://newsite.ru/countries/honduras.html">

В заключение мне хочется сказать, что те два года, что я общаюсь с редактором vim, меня не покидает ощущение волшебства. Я понял, что vim стал мне на самом деле удобнее любого другого редактора, когда стал угадывать его команды. Например, я знал, что удалить одно слово вместе с пробелом можно командой d a w. Как-то раз мне захотелось удалить предложение, и вспомнив, что по-английски предложение будет sentence, я нажал d a s — и это сработало. Однажды в чьём-то блоге (ссылку позабыл, к сожалению) я прочитал такое сравнение, воспроизвожу по памяти:

Конечно, нельзя сесть за vim и сразу начать работать. Необходимо приложить усилия, чтобы эффективно пользоваться мощнейшим текстовым редактором на свете. Многих это отпугивает. «Зачем», — говорят они, — «я буду тратить время на обучение, если и так могу отредактировать файл в своём любимом gedit, notepad++, geany?» Но ведь мало кого останавливает то, что машину нужно учиться водить. Зачем, мол, мне машина, если я могу ходить пешком и этому учиться не надо? Так и с vim. Вы тратите время на обучение, но затем работаете гораздо эффективнее. Вы учитесь водить машину, но затем перемещаетесь гораздо быстрее, чем пешком.

Красивое сравнение. Но неправильное. Освоить vim гораздо сложнее, чем научиться водить машину.

замена линии на другую, выдернутую раньше

хотя бы раз в день у меня возникает следующая ситуация:

A: This line should also replace line X
...
X: This is line should be replaced

Я считаю, что я не выполняю эту задачу эффективно.

что я делаю:

  • перейти к строке A:AG
  • Янк линия A:yy
  • перейти к строке X: XG
  • вставить строку A:P
  • перейти к старой линии: j
  • удалить старую строку: dd

это имеет дополнительный недостаток, что строка X теперь находится в регистре по умолчанию, что раздражает, если я нахожу другую строку, которая должна быть заменена на A. дергая и вставляя из дополнительного регистра («АУУ, » aP) делает эту простую задачу еще менее эффективной.

Мои Вопросы:

  • я пропустил встроенную команду Vim для замены дернутой строки раньше?
  • если нет, как я могу связать свою собственную команду, которая оставляет (или восстанавливает) вырванную строку в регистре по умолчанию?

16 ответов


что бы я сделал :

  1. aG
  2. Y
  3. xG
  4. Vp

вам не нужно выходить из нормального режима, но это тут дерни за веревку. Однако вы можете использовать V"0p который всегда будет ставить линию дернул в шаге 2.


Vp: выберите строку, вставьте то, что было выдернуто


Это имеет дополнительный недостаток
эта строка X теперь по умолчанию
регистрация, которая раздражает, если я нахожу
еще одна строка, которую следует заменить
с А.

чтобы удалить текст, не затрагивая обычные регистры, вы можете использовать регистр черной дыры "_:

"_dd

41

автор: Eugene Yarmash


Я бы использовал режим командной строки (Ex) и сделал следующие две команды

:XmA
:Ad

Это просто перемещает строку X чуть ниже A, а затем удаляет ходы, которые выстраиваются в линию

:7m3
:3d

9

автор: ericgamliel


  1. yy
  2. j (перейдите к строке, которую вы хотите заменить), а затем
  3. Vp (верхний регистр v, а затем p, будет заменен на дернутое содержимое)

8

автор: Mariano Anaya


  1. переход в начало первой строки.

  2. y, $ – скопируйте строку без линейного взлома в конце

  3. переместить в начало целевой линии.

    1. V, p – заменить только одну целевую строку

    2. c, c, Ctrlr, 0, Esc – замените целевую строку на оригинальную yank

  4. перейти к началу следующей целевой линии.

  5. . – повторяет команды в 4.2.

Примечания:

  • 4.1 составляет y, $ потому что если вы делаете y, y или Y вы скопируете linebreak, и Ctrlr, 0 фактически добавляет linebreak ниже вашей целевой линии.

  • 4.2 заменяет V p, который не работает с повтором, потому что технически последнее действие-удалить, поэтому . просто удалить строку.

  • Если кто-нибудь знает, как выдать » заменить текущую строку регистром’ из режима EX (командная строка), я хотел бы услышать от вас (и знать, где вы нашел документацию). Может быть повторяемая команда EX, которая быстрее 4.2 и / или не имеет предупреждения о взломе линии.

6

автор: Jordan Morris


Вы можете использовать это в визуальном режиме.

  • перейти к строке A:AG
  • выберите строку с визуальным режимом:VESC
  • перейти к строке X: XG
  • введите режим замены строки:S
  • вставьте скопированную строку:shift+вставить (или любое другое сопоставление, которое у вас есть для вставки из буфер.)

4

автор: Nathan Fellman


вот что я бы сделал

  • переместить начало строки A,AG (где A-номер строки, очевидно)
  • Yank line для некоторых регистров, например a (без новой строки). Тип "ay$
  • перейти к вставить строки XG
  • замена строки S
  • вставить из регистра a, Ctrl-Ra

3

автор: Brian Rasmussen


основываясь на ответах, которые предлагают использовать Vp или VP чтобы вставить строку — чтобы избежать изменения содержимого регистра yank, я считаю, что самая эргономичная команда просто:

VPY


вы можете использовать эти команды в нормальном режиме:

:AmX | Xd

на на m[ove], который перемещает номер строки A после номера строки X, если вы хотите скопировать вместо перемещения строки, используйте co[py]. the

2

автор: Nafaa Boutefer


  1. :ay (где a-номер строки. Пример :20й). Это тянет линию (каламбур).
  2. Vp

для этого мне проще использовать команду Ex; ex. чтобы переместить строку 9 в 46:

 :46|9m.|-1d

это переместит курсор на строку 46, переместит строку 9 ниже текущей,
затем удалите предыдущую строку (так как перемещенная строка является текущей).

или используя метку(ы), используя метку ‘a’:

:46ma a|9m'a|'ad

Мне часто приходится Y одну строку и заменять ее в нескольких местах, каждый из которых имеет другое значение (что означает, что я не могу выполнить регулярное выражение).

Y чтобы дернуть нужную исходную строку

и затем на каждой строке, которую вы хотели бы заменить,VpнольY


в свете недавнего комментария cicld (спасибо!), Я вижу, что я не полностью понял исходную проблему. Перемещение строки не подходит, но копирование (так как строка дернута.) Поэтому я бы изменил его на:

:1t20:20d_
  1. скопируйте 1-ю строку ( псевдоним :copy) после строки 20 (на линии 21)

  2. удалить строку 20, поместив удаленную строку в регистр «черная дыра» (_) (т. е. не влияет на текущий буфер Янка)

как отметил в своем недавнем комментарии, это не повлияет на текущую позицию курсора.


вы также можете сделать:

Vy (in normal mode at the line you want to copy)
Vp (in normal mode at the line you want to replace)
  • не создает пробелов или концов строк.
  • курсор помещается в начало скопированного текста.

одни и те же клавиши можно использовать для перетаскивания/вставки более одной строки.

V (in normal mode at what you want to yank)
(use jk to move the selection)
y (to yank the selection)
V (in normal mode at where you want to paste)
(use jk to move the selection)
p (to replace the selection with the yanked lines)

Я бы просто использовал регистр» черная дыра»:

дано:

nnoremap » _dd

решение:

yy


заменить все точки, кроме последней в строке

Я ищу способ, чтобы заменить все точки в строке, кроме последней.

пример:

Blah - whatever - foo.bar.baz.avi должны стать
Blah - whatever - foo bar bar.avi

поскольку у меня будет более одной строки в файле, а количество точек варьируется в каждой строке, я ищу общее решение, а не что-то вроде «заменить первые совпадения X» на X, являющееся константой.

7

автор: ThiefMaster

3 ответов


Это, кажется, сделать трюк:

%s/\.\(.*\.\)\@=/ /g

\@= это lookahead. Он соответствует только полной остановке, если есть какие-либо следующие полные остановки.

посмотреть :help zero-width.

11

автор: Felix Kling


в качестве варианта первого ответа вы можете предпочесть следующий синтаксис:

%s/\.M) только внутри визуального выбора (\%V).


Поиск, поиск и замена в Vim: подробное руководство

Могут ли разработчики выжить без хорошего поиска в редакторе? Кто никогда не использовал знаменитый трюк найти и заменить в одном или нескольких файлах?

Действительно, никто.

Хорошая новость: возможности поиска в Vim - это просто великолепие. С минимальной конфигурацией вы можете искать все, что хотите, где хотите, со скоростью света.

В этой статье мы узнаем, как:

  • Искать в текущем файле.
  • Искать в нескольких файлах.
  • Найдите и замените все, о чем мечтаете.
  • Используйте отличные плагины, чтобы превратить Vim в Search Monster ™.

Без функций поиска, которые я представлю вам в этой статье, Vim, возможно, не был бы частью моей среды разработки без мыши.

Небольшая точность: в этой статье я часто буду ссылаться на текущий рабочий каталог Vim . Команда ex : pwd может сказать вам, что ваше.Чтобы изменить его, вы можете использовать : cd mydirectory .

Если вам неудобно пользоваться Vim, я расскажу об основах, которые вам нужно знать.

Спасибо всем, кто помог мне с этой статьей, особенно хорошему сообществу Neovim Reddit. Я узнал тон от них!

Довольно лепета. Запустим Vim, поищем! Я предлагаю вам попробовать советы из этой статьи, пока вы их читаете: это поможет вам учиться и запоминать.

Поиск Vim в текущем файле

Основы

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

Чтобы просмотреть результаты вперед и назад, введите n и N (для n ext) соответственно.

При использовании / выполняется поиск в файле вперед. Если вам нужно напрямую искать в обратном направлении, вы можете использовать ? вместо этого.

Если вы хотите снова выполнить поиск, используя предыдущий шаблон поиска, // - ваш друг.

Выделение поиска

Полезно видеть, что поиск выделен в файле, но по умолчанию он не включен. Для этого вы можете ввести команду : set hlsearch или установить ее постоянно в вашем vimrc .

Если вы используете Neovim, подсветка установлена ​​по умолчанию.

Удаление последнего выделенного участка поиска

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

Так как вы действительно не хотите вводить эту команду каждый раз при поиске, вы можете сопоставить ключ с

Регулярные выражения Vim 101

I. Новости
II. Введение
2.1 Что такое VIM?
2.2 Об этом учебном пособии
2.3 Кредиты
III. Подстановка команды
3.1 Поиск и замена
3.2 Диапазоны линий и адресация
IV. Шаблон Описание
4.1 Якоря
4.2 «Экранированные» символы или метасимволы
4.3 Квантификаторы, жадные и не жадные
4.4 Диапазоны символов
4.5 Группировка и обратные ссылки
4.6 Чередования
4.7 Приоритет оператора
V. Глобальная команда
5.1 Глобальный поиск и выполнение
5.2 Примеры
VI. Примеры
6.1 Советы и приемы
6.2 Создание структуры
6.3 Работа с таблицами
VII. Другие ароматы Regexp
VIII. Ссылки

  • Эта страница была перенесена из старого геогорода, чтобы спасти его от преждевременной смерти. Если вы в прошлом поддерживали этот контент, пожалуйста, свяжитесь с нами (мы пытались связаться с вами, честно) чтобы сообщить нам, заинтересованы ли вы в возобновлении поддержки этого контента, или просто сказать "Ура!"

Vim - это улучшенная (во многих отношениях) версия vi, вездесущего текстового редактора. можно найти в любой системе UNIX.VIM был создан Брэмом Мооленаар с помощью других людей. Это бесплатно, но если вам это нравится Вы можете сделать благотворительную помощь детям-сиротам в Уганде.

У Vim есть собственный веб-сайт, www.vim.org и несколько списков рассылки, с огромным количеством информации по каждому аспекту VIM. Vim успешно прошел портирован практически на все существующие ОС. Это редактор по умолчанию во многих Linux. дистрибутивы (например, RedHat).

VIM имеет все возможности современного программистского редактора - макроязык, подсветка синтаксиса, настраиваемый пользовательский интерфейс, простая интеграция с различные IDE плюс набор функций, которые делают VIM настолько привлекательным для пользователи: восстановление после сбоя, автоматические команды, управление сеансом.

VIM имеет очень широкую и лояльную базу пользователей. Более 10 миллионов человек имеют он установлен (считая только пользователей Linux). По оценкам, есть около полумиллиона человек используют Vim в качестве основного редактора. И это число растет.

Я начал это руководство по одной простой причине - мне нравятся регулярные выражения. Ничто не сравнится с удовольствием от хорошо составленного регулярного выражения, которое делает именно то, что вы хотели :-).Надеюсь, это сносно в качестве предисловия.

Если говорить более серьезно, регулярные выражения (или для краткости регулярные выражения) инструменты, используемые для управления текстом и данными. Они не существуют как отдельные продукт, но обычно являются частью какой-либо программы / утилиты. Самый известный Например, UNIX grep, - программа для поиска в файлах строк, соответствовать определенному шаблону. Схема поиска описана в терминах обычных выражения. Регулярные выражения можно рассматривать как специализированный язык шаблонов.Регулярные выражения весьма полезны и могут значительно сократить время, необходимое для выполнения некоторых утомительное редактирование текста.

(терминология Regexp в значительной степени заимствована из книги Джеффри Фридла «Мастеринг. Регулярные выражения. ")

Большое спасибо (в произвольном порядке): Бенджи Фишер, Зденек Секера, Пребен "Пеппе" Гулдберг, Стив Киркендалл, Шауль Карл и все другие которые помогли мне своими комментариями.

Не стесняйтесь присылать мне ( volontir at yahoo dot com ) ваши комментарии. предложения, примеры ...

Итак, что можно делать с регулярными выражениями? Самая частая задача - это производить замены в тексте по определенным правилам. За это учебное пособие вам необходимо знать команду поиска и замены VIM (S&R) : заменить .Вот отрывок из справки VIM:

: диапазон s [ubstitute] / образец / строка / cgiI
Для каждой строки в диапазон заменяет совпадение из узор с строка где:

с

Подтверждать каждую замену

г

Заменить все вхождения в строке (без г - только сначала).

и

Игнорировать регистр для шаблона.

Я

Не игнорируйте регистр для шаблона.

Часть командного слова, заключенная в "[" & "]" можно не указывать.

Прежде чем я начну с описания шаблона, давайте поговорим об адресах строк. в Vim.Некоторые команды Vim могут принимать перед собой диапазон строк. От указав диапазон строк, вы ограничиваете выполнение команды этим конкретным только часть текста. Диапазон строк состоит из одного или нескольких спецификаторов строк, через запятую или точку с запятой. Вы также можете отметить свое текущее положение в тексте наберите м л , где "л" может быть любой буквой и использовать ее позже для определения адреса строки.

Спецификатор

Описание

номер

абсолютный номер строки

.

текущая строка

$

последняя строка в файле

%

весь файл. То же, что 1, $

' т

позиция отметки "т"

/ узор [/]

следующая строка, в которой совпадает текст «шаблон ».

? узор [?]

предыдущая строка, в которой текст « шаблон » соответствует

/

следующая строка, в которой ранее использованный шаблон поиска соответствует

\?

предыдущая строка, в которой совпадает ранее использованный шаблон поиска.

\ &

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

Если диапазон строк не указан, команда будет работать с текущим только линия.

Вот несколько примеров:

10,20

- с 10 по 20 строку.

За каждым может следовать (несколько раз) "+" или "-" и необязательный номер. Это число добавляется или вычитается из предыдущего номер строчки. Если номер не указан, используется 1.

/ Раздел 1 / +, / Раздел 2 / -

- все строки между участком 1 и участком 2, не включительно, п.е. строки, содержащие раздел 1 и Раздел 2 не будут затронуты.

Шаблон / / и ? узор ? май за ним следует другой адрес, разделенный точкой с запятой. Точка с запятой между два шаблона поиска указывают Vim, что нужно найти местоположение первого шаблона, затем начните поиск в этом месте второго шаблона.

/ Раздел 1 /; / Подраздел / -, / Подраздел / +

- сначала найдите Раздел 1, затем первую строку с Подразделом перейти на одну строку вниз (начало диапазона) и найдите следующую строку с Subsection, шаг на одну строку вверх (конец диапазона).

В следующем примере показано, как можно повторно использовать шаблон поиска:

: / Раздел / + y

- поиск строки сечения и скопировать (скопировать) одну строку после в память.

: // нормальный p

- и это будет искать следующий раздел строку и поместите (вставьте) сохраненный текст в следующую строку.

Совет 1: часто вам нужно выполнять S&R в тексте, который содержит Пути к файлам UNIX - текстовые строки с косой чертой ("/") внутри.Поскольку команда S&R использует косую черту для разделения шаблона / замены вы должны избегать каждой косой черты в своем шаблоне, т.е. использовать "\ /" для каждого "/" в вашем шаблоне:

с / \ / каталог1 \ / каталог2 \ / каталог3 \ / файл / каталог4 \ / каталог5 \ / файл2 / g

Чтобы избежать этого так называемого «обратного лабиринта», вы можете использовать разные разделители в S&R (я предпочитаю ":")

с: / каталог1 / каталог2 / каталог3 / файл: / каталог4 / каталог5 / файл2: g

Совет 2: Эти сопоставления могут оказаться полезными (поместите их в свой .vimrc файл)

noremap ;; :% s ::: g <Влево> <Влево> <Влево>
noremap; ' :% s ::: cg <Влево> <Влево> <Влево> <Влево>

Эти сопоставления избавят вас от лишних нажатий клавиш и позволят вам начать введите свой шаблон поиска. После его ввода вы переходите к замене часть, введите ее и нажмите return. Вторая версия добавляет подтверждение флаг.

Предположим, вы хотите заменить все вхождения vi с VIM.Это легко сделать с помощью

.

с / vi / VIM / g

Если вы пробовали этот пример, то, несомненно, заметили, что VIM заменил все вхождения vi, даже если это часть слова (например, навигатор). Если мы хочу быть более конкретным и заменить только целые слова vi тогда нам нужно исправить наш узор. Мы можем переписать его, поставив пробелы около vi:

с: vi: VIM: g

Но он все равно пропустит vi, за которым следует пунктуация или в конце строки / файла.vi $: VIM:

Теперь предположим, что вы хотите заменить не только все vi но также Vi и VI. Для этого есть несколько способов:

  • наверное, самый простой способ поставить "i" - игнорировать регистр в шаблон % s: vi: VIM: gi
  • определяют класс символов. Это последовательность заключенных символов квадратными скобками «[» и «]». Соответствует любому символу из этого набора. Итак, :% s: [Vv] i: VIM: будет соответствовать vi и Vi.Подробнее о диапазонах символов в следующий раздел.

До сих пор наши строки шаблонов были построены из обычных или литералов. текстовых символов. Сила регулярных выражений заключается в использовании метасимволов . Это типы символов, которые имеют особое значение внутри шаблон поиска. За некоторыми исключениями эти метасимволы различаются. "волшебной" обратной косой чертой перед ними.В таблице ниже перечислены некоторые общие метасимволы VIM.

#

Соответствие

#

Соответствие

.

любой символ, кроме новой строки

\ с

пробельный символ

\ S

непробельный символ

\ д

цифра

\ D

без цифр

\ х

шестнадцатеричная цифра

\ X

цифра не шестнадцатеричная

\ о

восьмеричная цифра

\ O

не восьмеричная цифра

\ ч

заглавие символа слова (a, b, c...z, A, B, C ... Z и _)

\ H

символ без заголовка слова

\ п

печатный символ

\ П

как \ p , но без цифр

\ Вт

словесный символ

\ Вт

несловесный символ

\ а

буквенный знак

\ A

неалфавитный символ

\ l

символ нижнего регистра

\ L

символ без нижнего регистра

\ u

символ верхнего регистра

\ U

символ верхнего регистра

Итак, чтобы сопоставить дату, например, 01.09.2000, вы можете использовать (при условии, что вы не используете "/" как разделитель в S&R)

\ д \ д / \ д \ д / \ д \ д \ д \ д

Для соответствия слову из 6 букв, начинающемуся с заглавной буквы

\ ш \ ш \ ш \ ш \ ш

Очевидно, что писать \ w для любого символ в шаблоне - что делать, если вы не знаете, сколько букв в твое слово? Этому может помочь введение так называемых кванторов .

Используя кванторы, вы можете установить, сколько раз определенная часть вашего паттерна следует повторить, поставив после шаблона следующее:

Квантификатор

Описание

*

соответствует 0 или более из предшествующих символов, диапазонов или метасимволов .* соответствует всему, включая пустую строку

\ +

соответствует одному или нескольким предыдущим символам ...

\ =

соответствует 0 или 1 из предшествующих символов ...

\ {n, m}

соответствует от n до m предыдущих символов...

\ {n}

совпадает ровно n раз с предыдущими символами ...

\ {, m}

соответствует не более чем m (от 0 до m) предшествующих символов ...

\ {n,}

соответствует как минимум n из предыдущих символов...

, где n и m - целые положительные числа (> 0)

Теперь гораздо проще определить шаблон, который соответствует слову любое длина \ u \ w \ + .

Эти квантификаторы жадные - это ваш шаблон будет пытаться сопоставьте как можно больше текста . Иногда это представляет собой проблема.Рассмотрим типичный пример - определим шаблон для соответствия текст с разделителями, т. е. текст, заключенный в кавычки, скобки и т. д. Поскольку мы не знаю, какой текст внутри кавычек, мы будем использовать

/".*"/

Но этот шаблон будет соответствовать всему между первым " и последний "в следующей строке:

этот файл обычно называется "$ VIM / .gvimrc". Вы можно проверить это с помощью ": version".

Эту проблему можно решить с помощью нежадных квантификаторов:

Квантификатор

Описание

\ {-}

соответствует 0 или более из предшествующего атома, как можно меньше

\ {- n, м}

соответствует одному или нескольким предыдущим символам...

\ {- n,}

соответствует или более чем соответствует предыдущим символам ...

\ {-, м}

соответствует одному или нескольким предыдущим символам ...

, где n и m - целые положительные числа (> 0)

Давайте используем \ {-} вместо * в нашем шаблоне.Итак, теперь ". \ {-}" будет соответствовать первому цитируемому тексту:

этот файл обычно называется «$ VIM / gvimrc». Вы можете проверить это с помощью ": version".

. \ {-} Шаблон не без сюрпризов. Посмотри что будет к следующему тексту после применения:

: s:. \ {-}: _: g

Раньше:

n и m десятичные числа от до

.

После:

_n_ _a_n_d_ _m_ _a_r_e_ _d_e_c_i_m_a_l_ _n_u_m_b_e_r_s_ _b_e_t_w_e_e_n_

«Как можно меньше» здесь означает замену нулевого символа.Однако совпадение между символами происходит ! Чтобы объяснить это поведение Цитирую самого Брэма:

Совпадение нулевых символов по-прежнему считается совпадением. Таким образом он заменит нулевые символы с "_". А затем перейдите к следующей позиции, где он будет соответствовать снова.

Это правда, что использование "\ {-}" в большинстве случаев бесполезно. Это работает так чтобы соответствовать символу "*", который также соответствует нулю. Есть больше бесполезных: "x \ {- 1,}" всегда соответствует одному x.Вы могли бы просто использовать "Икс". Более полезно что-то вроде "x \ {70}". Остальные просто последовательны поведение: ..., "x \ {- 3,}", "x \ {- 2,}", "x \ {- 1,}.

- Брам

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

Типичные диапазоны символов:

[012345] будет соответствовать любому из чисел в скобках. Тот же диапазон можно записать как [0-5] , где тире указывает диапазон символов в порядке ASCII. Аналогичным образом мы можем определить диапазон для всех строчных букв: [a-z] , для всех букв: [a-zA-Z] , буквы и цифры: [0-9a-zA-Z] и т. д.В зависимости от вашей системы locale вы можете определить диапазон, который будет включать такие символы, как à, Ö, ß и другие символы, отличные от ASCII.

Обратите внимание, что диапазон составляет всего один символ в поиске шаблон, то есть [0123] и 0123 не являются тем же. Точно так же порядок (за некоторыми исключениями) не важен: [3210] и [0123] - те же диапазоны символов, а 0123 и 3210 - это два разных шаблона.Посмотрите, что происходит, когда применяем

с: [65]: Dig: g

на следующий текст:

Раньше:

Высокая от 65 до 70. Ветер юго-восточный вокруг 10

После:

High DigDig до 70. Юго-восточный ветер около 10

и сейчас:

с: 65: Dig: g

Раньше:

Высокая от 65 до 70."потеряет свой особый означает, что это не первый символ в диапазоне.

А теперь давайте рассмотрим пример из реальной жизни. Предположим, вы хотите запустить грамматику проверьте свой файл и найдите все места, где новое предложение не начинается с большой буквы. Шаблон, который поймает это:

\. \ S \ + [а-я]

- точка, за которой следует один или несколько пробелов и слово в нижнем регистре. Мы знаем как найти ошибку, теперь посмотрим, как ее исправить.Сделать это нам нужно каким-то образом запомнить наш согласованный образец и вспомнить его позже. Это именно то, для чего нужны обратные ссылки .

Вы можете сгруппировать части выражения шаблона, заключив их в " \ (" и " \) " и обратитесь к ним внутри замены узор по их специальному номеру \ 1, \ 2 ... \ 9 . Типичный пример меняет местами первые два слова строки:

s: \ (\ w \ + \) \ (\ s \ + \) \ (\ w \ + \): \ 3 \ 2 \ 1:

, где \ 1 - первое слово, \ 2 - любое число пробелов или табуляции между ними и \ 3 - второе слово.Как решить какое число какая пара \ (\) ? - счет открытия " \ (" слева.

Запасная часть: заменить

Запасная часть S&R имеет свои собственные специальные символы, которые мы собираемся использовать для исправления грамматики:

#

Значение

#

Значение

и

весь подобранный узор

\ L

следующие символы делаются строчными

\ 0

весь подобранный узор

\ U

следующие символы делаются прописными

\ 1

совпавший шаблон в первой паре \ (\)

\ E

конец \ U и \ L

\ 2

совпадающий образец во второй паре \ (\)

\ e

конец \ U и \ L

...

...

\ r

разделить линию на две части

\ 9

совпадающий узор в девятой паре \ (\)

\ l

следующий символ в нижнем регистре

~

предыдущая замещающая строка

\ u

следующий символ в верхнем регистре

Теперь полное S&R для исправления не заглавных слов в начале предложения выглядят как

с: \ ([.!?] \) \ s \ + \ ([a-z] \): \ 1 \ u \ 2: g

Мы исправили нашу грамматику и в качестве дополнительной работы заменили переменную количество пробелов между пунктуацией и первой буквой следующего предложение ровно с двумя пробелами.

Используя « \ | » вы можете комбинировать несколько выражений в тот, который соответствует любому из его компонентов. Первое совпадение будет использоваться.

\ (Дата: \ | Тема: \ | От: \) \ (\ s.* \)

будет разбирать различные заголовки писем и их содержимое в \ 1 и \ 2 соответственно. О чередовании VIM нужно помнить, что он не жадный. Он не будет искать самое длинное совпадение, он будет использовать первое, что совпадает. Это означает, что порядок элементов в чередовании важен!

Совет 3: Быстрое сопоставление для помещения \ (\) в строку шаблона

cmap; \ \ (\) <влево> <влево>

Как и в арифметических выражениях, регулярные выражения выполняются в определенных порядок приоритета.Вот таблица приоритета, от высшего к низшему:

Старшинство

Регулярное выражение

Описание

1

\ (\)

группировка

2

\ =, \ +, *, \ {n} и т. Д.

кванторы

3

abc \ t \. \ W

последовательность символов / метасимволов, не содержащая кванторы или операторы группировки

4

\ |

чередование

Я хочу представить еще одну весьма полезную и мощную команду Vim, которая мы собираемся использовать позже

: диапазон г [лобальный] [!] / шаблон / cmd
Выполнить команду Ex cmd (по умолчанию «: p ») в строках в пределах [ range ], где шаблон совпадения.Если шаблону предшествует ! - только где совпадение не встречается.

Глобальные команды работают, сначала сканируя [ range ] из строк и отмечая каждую строку, где происходит совпадение. Через секунду сканирование [ cmd ] выполняется для каждой отмеченной строки с ее номером строки добавлено. Если строку изменить или удалить, ее отметка исчезнет. По умолчанию для [ range ] - это весь файл.Ошибка/ . w >> errors.txt

- в текстовом блоке с пометкой 'a и ' b найти все строки, начинающиеся с ошибки, и скопируйте (добавить) их в файл "errors.txt". Примечание: . (текущий адрес строки) перед w очень важно, опуская это вызовет : write для записи всего файла в "errors.txt" для каждой найденной строки ошибки.

После : global можно вводить несколько команд с помощью символа "|" как разделитель.Ошибка: / s / Ошибка / копия ошибки / | копия $

- здесь порядок обратный: сначала измените строку, затем скопируйте в конец.

Сборник полезных советов по S&R:

(1) прислал Антонио Коломбо:

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

s: \ s * $ ::

или (чтобы не работать на всех линиях):

s: \ s \ + $ ::

Для этого примера вам нужно немного знать HTML.Мы хотим сделать стол содержания из заголовков х2 и х3 , которые Я буду звать майоров и несовершеннолетних. HTML-заголовок h2 - это текст заключены в теги

, как в

Заголовок

.

(1) Сначала давайте сделаем именованные якоря во всех заголовках, т.е. поместим

Заголовок

вокруг все заголовки. "Якорь " - это уникальный идентификатор. этого конкретного места в HTML-документе.Следующее S&R делает именно это:

: s: \ ( \) \ (. * \ S \ + \ ([- a-zA-Z] \ + \) \) \ s * \ ( \): \ 1 \ 2 \ 4:

Пояснение: первая пара \ (\) сохраняет открытие тег ( h2 или h3 ) на \ 1 , второй пара сохраняет весь текст заголовка перед закрывающим тегом, третья пара сохраняет последнее слово в заголовке, которое мы позже будем использовать для "якоря" а последняя пара сохраняет закрывающий тег.Замена вполне очевидна - мы просто реконструируем новый "именованный" заголовок, используя \ 1- \ 4 и ссылку на тег .

(2) Теперь скопируем все заголовки в одно место:

:% г / <ч [12]> / т $

Эта команда ищет в нашем файле строки, начинающиеся с

или

и копирует их в конец файла. Сейчас же у нас есть несколько строк вроде:

Заголовок1>


Заголовок2>


< a name = "anchor3"> Heading3>


..........................

HeadingN>

Во-первых, мы хотим преобразовать все name = " в href =" # чтобы связать записи таблицы с соответствующими местами в тексте:

s: name = ": href =" #:

Во-вторых, мы хотим, чтобы наши записи h2 отличались от h3 . Определим классы CSS "majorhead" и "minorhead". и сделайте следующее:

г /

/ с: г /

/ s:

Теперь наши записи выглядят так:

Заголовок1>


Заголовок2>

Нам больше не нужны теги h2 и h3 :

с: ::

и замените закрывающие теги на структурные строки

с: / ч [21]: br:

Заголовок1>

Заголовок2>

Довольно часто приходится работать с текстом, организованным в виде таблиц / столбцов.Рассмотрим, например, следующий текст

Азия

Америка

Африка

Европа

Африка

Европа

Европа

Африка

Европа

Азия

Европа

Европа

Предположим, мы хотим изменить все ячейки «Европа» в третьем столбце. в «Азию»:

:% s: \ (\ (\ w \ + \ s \ + \) \ {2} \) Европа: \ 1 Азия:

Азия

Америка

Африка

Европа

Африка

Европа

Азия

Африка

Европа

Азия

Азия

Европа

Чтобы поменять местами первый и последний столбцы:

:% s: \ (\ w \ + \) \ (.* \ s \ + \) \ (\ w \ + \) $: \ 3 \ 2 \ 1:

Европа

Америка

Африка

Азия

Африка

Европа

Европа

Африка

Европа

Азия

Европа

Европа

Продолжение следует...

Здесь я хотел бы сравнить реализацию регулярного выражения Vim с другими, в частности, Perl's. Невозможно говорить о регулярных выражениях без упоминая Perl.

(с помощью Стива Киркендалла) Основные различия между Perl и Vim:

  • Perl не требует обратной косой черты перед большинством своих операторов.Лично, Думаю, это делает регулярные выражения более читаемыми - тем меньше люфтов лучше.
  • Perl позволяет конвертировать любой квантификатор в нежадную версию добавив дополнительную? после этого. Так *? не жадный *.
  • Perl поддерживает множество странных опций, которые можно добавить к regexp или даже встроить в него.
  • Вы также можете встроить имена переменных в регулярное выражение Perl. Perl заменяет имя своим значением; это называется «переменная интерполяция».

Прочтите документацию VIM о шаблонах и поиске. Чтобы получить этот тип ": help pattern" в нормальном режиме VIM.

В настоящее время на рынке есть две книги, посвященные регулярному использованию VIM. выражения:

Окончательный справочник по регулярным выражениям - в книге Джеффри Фридла "Mastering" Регулярные выражения ", опубликованное O'Reilly & Associates, но в основном это касается регулярных выражений Perl.У О'Рейли есть один из главы книги доступны в Интернете.


Найти, преобразовать и заменить даты с помощью подстановок Vim

Команда подстановки Vim - мощный способ вносить изменения в текстовые файлы. Помимо поиска и замены текста с помощью регулярных выражений, замены могут вызовите внешние программы для более сложных замен.Используя date из подстановки, Vim может преобразовать все даты в файле в другой формат и заменить их все сразу.

Входной файл - это HTML-страница со списком статей. Каждая статья включает тег со значением и атрибутом datetime для отображения публикации Дата.

Входной файл
  
  • <статья>

    Найти, преобразовать и заменить даты заменами Vim

  • <статья>

    Обеспечение поддержки проектов программного обеспечения с открытым исходным кодом

  • <статья>

    Тестирование на основе свойств в Elixir с использованием PropEr

  • Нам нужно преобразовать значения дат в более удобный формат,
    включает полное название месяца («19 сентября 2017 г.») с сохранением
    Атрибуты datetime в их текущем формате.

    Результат: статьи с переформатированными датами

      
  • <статья>

    Поиск, преобразование и замена дат с помощью замен Vim

  • <статья>

    Обеспечение поддержки проектов программного обеспечения с открытым исходным кодом

  • <статья>

    Тестирование на основе свойств в Elixir с использованием PropEr

  • Во входном файле более сорока статей, поэтому заменяя их все вручную
    будет много работы, подверженной ошибкам.Вместо этого мы пишем замену, которая
    находит все даты в файле и заменяет их переформатированным значением.

    Поиск дат

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

    Чтобы найти все даты в файле, можно использовать ....-..- .. ( esc
    /....-..- .. ) в качестве шаблона поиска, чтобы соответствовать формату даты. Однако это
    результаты шаблона будут включать все совпадающие даты в файле, включая
    в атрибутах datetime тегов .

        

    Во входном файле сразу за всеми значениями <время> следует
    знак меньше из закрывающего тега . Чтобы предотвратить дату
    атрибуты, которые будут включены в результаты, мы могли бы включить менее чем
    войдите в шаблон поиска и обязательно добавьте его при замене.

    Hoever, Vim поддерживает установку начала и конца совпадения в поиске
    шаблон с использованием атомов шаблона \ zs и \ ze .Путем префикса < в нашем
    шаблон поиска с \ ze , шаблон находит все даты, за которыми следует меньше чем
    знак, но не включает его в соответствие, то есть не будет заменен.

    Переформатирование дат из командной строки

    Нам нужно полное название месяца в заменах даты, поэтому мы не можем изменить порядок
    введите значение («2017-10-17»), чтобы получить желаемый результат. Вместо этого нам нужно
    вызвать внешнюю утилиту, которая знает названия месяцев и может конвертировать между
    форматы даты.

    Мы переформатируем каждое совпадение нашего шаблона поиска в желаемый формат («Сентябрь
    19, 2017 ») с утилитой date . Мы используем "% Y-% m-% d" как формат ввода
    чтобы соответствовать результатам из шаблона поиска. Выходной формат - это "% B% d,
    % Y "
    , чтобы получить полное название месяца, номер даты, запятую и год.
    число.

    С этими форматами программа date переформатирует 1991-11-02 на 2 ноября,
    1991
    .

     $ date -jf "% Y-% m-% d" "1991-11-02" + "% B% d,% Y"
    02 ноября 1991 
    -j
    Не пытайтесь установить системную дату
    -f "% Y-% m-% d"
    Используйте переданный формат ввода вместо формата по умолчанию. В данном случае "% Y-% m-% d"
    чтобы соответствовать формату ввода ( 1991-11-02 ).
    "1991-11-02"
    Пример даты для анализа с использованием входного формата, переданного в -f .
    + "% B% d,% Y"
    Выходной формат, который дает 2 ноября 1991 г. .

    Обращение к внешним утилитам при замене

    Мы знаем, как найти все даты в файле и как преобразовать дату в другую
    формат из командной строки. Чтобы заменить все найденные даты на переформатированные
    версии из утилиты date , нам нужно запустить выражение из
    замена .

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

    :% s /....-..- .. \ ze 
    ....-..- ..
    Шаблон поиска для поиска всех дат в файле.
    2 ноября 1991 г.
    Буквальная замещающая строка для замены дат на жестко заданные.

    Вместо того, чтобы вставлять жестко запрограммированную заменяющую строку, нам нужно запустить
    выражение для каждого совпадения, чтобы получить его замену.

    Мы используем функцию system () из выражения ( \ = ) для вызова
    дата утилита. Пока придерживаемся жестко запрограммированных дат, мы можем использовать утилиту
    преобразовать формат даты из «1991-11-02» в «2 ноября 1991 г.» перед
    вставив в файл:

    :% s /....-..- .. \ ze 
    ....-..- .. \ ze <
    Шаблон поиска для поиска всех дат в файле.
    \ = system ('date…')
    Выражение, которое использует функцию system () для выполнения внешнего
    команда и возвращает ее значение как заменяющую строку.
    'date -jf "% Y-% m-% d" "1991-11-02" + "% B% d,% Y"'
    Команда даты в виде строки с жестко заданной датой
    ( "1991-11-02" ) в качестве входного аргумента даты. Эта дата соответствует формату
    совпадения поискового шаблона.
    Предупреждение:

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

    Значение замены все еще жестко запрограммировано («1991-11-02»), поэтому эта замена
    перезапишет все значения даты в файле на дату 1991 года.
    совпадающие значения даты обратно в файл, нам нужно передать их команде date.

    Чтобы передать согласованную дату вызову date в нашем выражении, нам нужно
    вырваться из строки, переданной в функцию system () , и заменить
    жестко запрограммированная дата с вызовом submatch (0) для вставки всего совпадения.

    :% s /....-..- .. \ ze 

    Выполнение этой замены превратит все теги из входного файла в
    наш желаемый формат, но он помещает новую строку перед закрывающим тегом .

    Текущий результат с добавленной новой строкой перед закрывающим тегом

      
  • <статья>

    Поиск, преобразование и замена дат с помощью замен Vim

  • Вложенные замены

    Новая строка добавляется к результату команды date , которая заканчивается в
    файл после выполнения подстановки.Поскольку нет возможности узнать дату
    чтобы опустить новую строку, нам нужно убрать ее самим.

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

    :% s / \ n <\ / time> / <\ / time> / g 

    Чтобы оригинальная подстановка не добавляла новые строки, мы
    может передать результат из команды date на tr , чтобы удалить новую строку с помощью
    аргумент -d :

    :% s /....-..- .. \ ze 

    Другой вариант - убрать новую строку с помощью вложенной замены .

    Оборачиваем вызов утилиты date во вложенную замену с помощью
    replace () функция. Принимает результат, соответствует новой строке ( "\ n" ) и
    заменяет его пустой строкой.

    :% s /....-..- .. \ ze 

    Теперь наша подстановка преобразует теги в правильный формат,
    без добавления этой дополнительной строки.

    Результат

     
  • <статья>

    Поиск, преобразование и замена дат с помощью замен Vim

  • <статья>

    Обеспечение поддержки проектов программного обеспечения с открытым исходным кодом

  • <статья>

    Тестирование на основе свойств в Elixir с использованием PropEr

  • Спасибо Воутеру Восу и Рико Ста.Круз за отзыв о команде замены.
    style, u / Vurpius за предложение \ ze и Бен Синклер за предложение трубопровода
    через т.р. .

    Обзор Vim 7 и поддерживаемые типы файлов

    Обзор программного обеспечения

    Основные характеристики

    • Широкие возможности настройки
    • Использует настраиваемые сопоставления клавиш для автоматизации работы
    • Сравнивает и объединяет файлы
    • Поддерживает расширенные регулярные выражения
    • Доступно в интерфейсе командной строки или графическом интерфейсе

    Vim - это бесплатный текстовый редактор с открытым исходным кодом, предназначенный для редактирования исходного кода.У него более острая кривая обучения, чем у большинства других простых текстовых редакторов, и он не предназначен для начинающих пользователей. Vim также доступен на Mac как MacVim и Windows как gVim.

    Vim обладает широкими возможностями настройки, чтобы вы могли персонализировать свой опыт и максимизировать свою продуктивность. Вы можете использовать его с графическим интерфейсом пользователя или из интерфейса командной строки. Он позволяет вам определять собственные сопоставления клавиш для автоматизации последовательностей нажатий клавиш или вызова пользовательских функций. Также доступно множество плагинов для добавления к функциональности Vim.

    Если вы хорошо разбираетесь в компьютерах и предпочитаете использовать свои приложения с минимальным вмешательством графического интерфейса, Vim - хороший текстовый редактор для вас. Если вам не хочется учиться использовать Vim, лучше выбрать простой текстовый редактор, такой как Блокнот или TextEdit.

    Поддерживаемые типы файлов

    Расширение основного файла
    Другие расширения файлов, используемые Vim 7

    90 Файл описания машины

    6

    Поддерживаемые типы файлов
    .A Статическая библиотека
    .ANS Текстовый файл ANSI
    .ASM Файл исходного кода языка ассемблера
    .AWK Скрипт AWK
    .BSH Скрипт BeanShell
    .BVH .BVH Файл
    .C Файл исходного кода C / C ++
    .CELX Celestia Script
    .CFG Файл конфигурации
    .CFG Файл языка разметки Wesnoth
    .CGI Сценарий интерфейса общего шлюза
    .COMMAND Файл команд терминала
    .CONF Файл конфигурации Unix
    9010CSH Shell Script
    .DXL Файл языка Domino XML
    .ERR Файл журнала ошибок
    .EXW Файл исходного кода Euphoria
    .GVIMRC Файл конфигурации времени выполнения GVim
    .H Файл заголовка C / C ++ / Objective-C
    .HS Скрипт Haskell
    .INC Включить файл
    .J Файл исходного кода Java
    .JSON Файл нотации объекта JavaScript
    .L Исходный файл Lex
    .LHS Literate Haskell Script
    .LUA Исходный файл Lua
    .M Исходный код Mercury
    .M Файл реализации Objective-C
    .MARKDOWN Файл документации Markdown
    .MD
    .ML Файл исходного кода ML
    .MXML Компонент Flex MXML
    .P6 Файл исходного кода Perl 6
    .PHP3 Веб-страница PHP 3
    .PROPERTIES Файл свойств Java
    .RPY Скрипт Python
    .RST Файл reStructuredText
    .S
    .SH Bash Shell Script
    .SQL Файл данных языка структурированных запросов
    .TEX Исходный документ LaTeX
    .UTF8 Текстовый документ в кодировке Unicode UTF8
    .YML Документ YAML
    Дополнительные связанные форматы файлов
    .GALAXY Файл Blizzard Galaxy
    .J Исходный файл Java
    .JAV Исходный файл Java
    .LDF Lingo Dictionary Исходный файл
    .LIST Файл списка APT
    .LPD LPD Daemon Print Permissions File
    .LTX LaTeX Document
    .MAN Unix Manual
    .MD Файл документации Markdown
    Markdown Файл документации Markdown
    .
    .TLD Файл дескриптора библиотеки тегов
    .VIM Файл настроек Vim
    .VIMRC Файл конфигурации времени выполнения Vim
    .YAML Документ YAML

    Обновлено: 29 апреля 2014 г.

    Практический Vim: режимы

    Практический Vim: режимы

    17 марта 2018

    Заметки серии

    о Practical Vim Д. Нила:

    Содержание

    Глава 1 - Путь Vim

    Совет 1. Повторите с командой точки

    . : повторить последнее изменение

    > G : отступ строк до конца файла

    Совет 2: добавьте строку и повторите

    A : добавить в конец текущей строки

    C = c $ : удалить до конца строки в режиме вставки

    с = cl : удалить символ справа в режиме вставки

    Совет 3. Сканируйте вперед и повторите

    f + : прямая линия развертки для символа +

    ; : строка прямого сканирования для последнего символа прямого сканирования

    ;.: строка прямого сканирования для последнего просматриваемого вперед символа, повторить последнее выполненное изменение

    Совет 4: Повторение и обратное

    Намерение Закон Повторить Реверс
    внести изменения {редактировать} . u
    строка развертки для следующего символа f {char} / t {char} ; ,
    строка развертки предыдущего символа F {char} / T {char} ; ,
    сканировать документ для следующего совпадения / узор n N
    отсканировать документ на предыдущее совпадение? Узор n N
    выполнить замену: с / цель / замена и

    .

  • Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *