Знайти та замінити в межах виділення у `vi`


Відповіді:


89

Виділіть текст у візуальному режимі (я вважаю, це те, що ви робите), потім натисніть, :щоб почати вводити команду, у командному рядку з’явиться щось подібне:

:'<,'>

Це означає, що команда застосовуватиметься до виділення. Потім введіть s/search/replace/і натисніть Enter. (Додайте символ gпісля третьої риски, якщо ви хочете замінити всі збіги, і знак, cякщо ви хочете підтвердити кожну заміну)


46
Застереження: асортимент працює лише лінійно! Якщо ваш вибір містить лише частину рядка, пошук і заміна працюватимуть на цілому рядку. Для часткового пошуку та заміни рядка потрібні сценарії afaik.
user55400

3
Я пропоную тимчасово перенести його на інший рядок, виконати заміну та повернути назад.
Бенджамін Аткін,

89

Більшість інших запропонованих тут рішень працюють по ВСІЙ лінії, в якій відбувається вибір, що може бути не тим, що ви хочете.

Щоб здійснити пошук та заміну ТІЛЬКИ у виділенні, спочатку візуально виділіть текст, а потім скористайтеся командою приблизно такою:

:%s/\%VSEARCH/REPLACE/g

Це зробить пошук та заміну лише у візуально вибраному розділі, замінивши ПОШУК на ЗАМІНИ. Якщо у вас вибрано більше одного рядка, це також буде працювати над кількома рядками.


Чи це має працювати для заміни при візуальному виділенні частини рядка? Я не можу змусити це працювати для заміни пробілів на return. Я відбираю частину рядка, і вони користуються :%s/\%V /\r/gбез радості. Перший пробіл замінено, але наступні 4 залишаються недоторканими.
bentayloruk

Я щойно спробував, і це працює для всіх випадків, які я пробував, за винятком заміни на повернення ;-) Я думаю, це повинно бути, тому що перша заміна розбиває виділення на новий рядок, якого вже немає у виділенні. Як обхідний шлях ви можете замінити унікальний рядок, наприклад EZ_REPLACE, потім здійснити глобальний пошук і замінити це ...
Бред Паркс,

погано відтворюється при перекодуванні в макрос. відтворення макросу через діапазон рядків не працює.
Peter Perháč,

2
Для отримання додаткової інформації див. Vim.fandom.com/wiki/Search_and_replace_in_a_visual_selection
Antony

@BradParks AFAIK, вам потрібно \%VSEARCH%Vзамість лише\%VSEARCH
Atralb

21

Якщо ви вибрали візуальний режим, то:

:'<,'>s/regex/replacement/options

VIM автоматично розмістить діапазон ( '<,'>), якщо ви перейдете в режим командного рядка (натисканням ':') з візуального режиму.


1
Теоретично це повинно працювати за призначенням, але, як зазначав хтось інший, на практиці відбувається заміна в будь-якому місці рядків, де позначка <починається і де >закінчується. Можливо, це можливо змусити його працювати з \%'>атомом .. але мої початкові експерименти провалились.
alpha_989


2

Діапазон команд Ex задається лінійно (див. *cmdline-ranges*), І при :натисканні, коли відбувається візуальний вибір, діапазон рядків автоматично вказується в командному рядку як '<,'>(див. *v_:*), Що змушує :s[ubstitute]команду працювати на цілі рядки, якщо тільки межі візуального виділення задаються в шаблоні пошуку за допомогою \%V(див. */\%V*), наприклад, /\%Vvi\%Vmвідповідає "vim" лише в межах візуального виділення, де кінець виділення вказується безпосередньо перед кінцем шаблону пошуку, оскільки кожен \%Vвизначає наступний символ як початку або кінця візуального виділення, і, отже /\%Vvim\%V, вимагатиме, щоб візуальний вибір продовжувався після 'm', щоб відповідати "vim". Зверніть увагу, що за допомогою другого\%V у шаблоні пошуку не потрібно, якщо збіг не повинен знаходитись прямо на межі або лише частково у візуальному виділенні.


-3

Якщо ви хочете здійснити глобальний пошук та заміну (з необов’язковими регулярними виразами) для всіх екземплярів у файлі, я б зробив наступне:

:%s/foo/bar/g

Опустіть g, щоб зробити локальну заміну.


Місцевий житель є місцевим до поточної лінії
Лазар
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.