Заміна "перший, останній" на "останній, перший"

Якщо у вас, наприклад, є список імен у вигляді:

Фамілія, Ім'я Bond, James Cooper, Garry

і виникло бажання поміняти їх на:

Ім'я Фамілія

Це можна здійснити командою:

:1,$s/\([^,]*\), \(.*$\)/\2 \1/

Двокрапка (:) вказує Vim що це команда типу ex.

Інтервалом рядків для цієї команди буде весь файл, як зазначено показником інтервалу 1,$.

Команда s (substitute) вказує Vim здійснити заміну.

Текст що буде замінено позначено складним регулярним виразом. Обмежувач \( ... \) використовуються для підказки редактору що текст що співпаде з регулярним виразом всередині буде розглядатися як спеціальний (буде привнесено у регістр пам'яті регулярних виразів).

Текст що співпав всередині першого \( ... \) буде позначено як \1 у виразі заміни. Все що співпало з наступним виразом, включеним у \( ... \) відповідатиме \2 виразу заміни, і так далі.

:1,$s/\([^,]*\), \(.*$\)/\2 \1/

У цьому конкретному випадку, першим регулярним виразом (включеним у екрановані дужки) буде набір будь-яких знаків окрім коми. [^,] означає будь-які знаки крім коми, тоді як кількісний показник * вказує на нуль або більше цих знаків.

Наступний вираз у екранованих дужках співпадатиме з усім .* аж до кінця рядка.

В результаті, перше слово рядка буде присвоєне \1 і друге - \2. У виразі заміни ми лише поміняємо їх місцями.

Наступне ілюструє взаємозв'язок між виразами, включеними у \(\) й \1,\2 позначеннями:

:1,$s/\([^,]*\), \(.*$\)/\2 \1/
      ^^     ^^  ^^   ^^^ ^  ^            
      ||     ||  ||   ||| |  +-----  Текст що співпав із першим \( \)
      ||     ||  ||   ||| |          
      ||     ||  ||   ||| +--------- Текст що співпав із другим \( \)
      ||     ||  ||   |||            
      ||     ||  ||   ||+----------- Слеш що розділює старий текст і новий
      ||     ||  ||   ||             
      ||     ||  ++---++------------ Другий \( \) 
      ++-----++--------------------- Перший \( \)

Наступна ілюстрація розбиває на частини різноманітні регулярні вирази, використані у цьому прикладі.

:1,$s/\([^,]*\), \(.*$\)/\2 \1/
        ^^^^^  ^^  ^^^
        |||||  ||  ||+--- Знак кінця рядка
        |||||  ||  |+---- 0 або більше разів
        |||||  ||  +----- Любий знак
        |||||  ||  +++--- Любий знак у любій кількості
        |||||  ||         із послідуючим кінцем рядка (EOL)
        |||||  |+-------- Буквальний знак пробілу
        |||||  +--------- Буквальна кома 
        ||||+------------ 0 або більше разів
        |||+------------- Замикає [] вираз
        ||+-------------- знаку коми
        |+--------------- Співпаданна за винятком
        |                 
        +---------------- Вираз списку знаків
        ++++------------- Співпаде з будь-яким знаком крім коми
            +------------ (будь-який знак) 0 або більше разів
               +--------- З послідуючою комою