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 або більше разів
		       +--------- З послідуючою комою
Особисті інструменти