Vim Cookbook/last
Матеріал з docs.linux.org.ua — збірника документації з Unix/Linux українською мовою.
Заміна "перший, останній" на "останній, перший"
Якщо у вас, наприклад, є список імен у вигляді:
- Фамілія, Ім'я
- 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/<span style="background: #99CCCC">\([^,]*\)</span>, <span style="background: #9999CC">\(.*$\)</span>/<span style="background: #9999CC">\2</span> <span style="background: #99CCCC">\1</span>/
^^ ^^ ^^ ^^^ ^ ^
|| || || ||| | +----- Текст що співпав із першим \( \)
|| || || ||| |
|| || || ||| +--------- Текст що співпав із другим \( \)
|| || || |||
|| || || ||+----------- Слеш що розділює старий текст і новий
|| || || ||
|| || ++---++------------ Другий \( \)
++-----++--------------------- Перший \( \)
Наступна ілюстрація розбиває на частини різноманітні регулярні вирази, використані у цьому прикладі.
:1,$s/\([^,]*\), \(.*$\)/\2 \1/ ^^^^^ ^^ ^^^ ||||| || ||+--- Знак кінця рядка ||||| || |+---- 0 або більше разів ||||| || +----- Любий знак ||||| || +++--- Любий знак у любій кількості ||||| || із послідуючим кінцем рядка (EOL) ||||| |+-------- Буквальний знак пробілу ||||| +--------- Буквальна кома ||||+------------ 0 або більше разів |||+------------- Замикає [] вираз ||+-------------- знаку коми |+--------------- Співпаданна за винятком | +---------------- Вираз списку знаків ++++------------- Співпаде з будь-яким знаком крім коми +------------ (будь-який знак) 0 або більше разів +--------- З послідуючою комою

