Заміна "перший, останній" на "останній, перший"
Якщо у вас, наприклад, є список імен у вигляді:
Фамілія, Ім'я 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 або більше разів
+--------- З послідуючою комою