Important Announcement
PubHTML5 Scheduled Server Maintenance on (GMT) Sunday, June 26th, 2:00 am - 8:00 am.
PubHTML5 site will be inoperative during the times indicated!

Home Explore 2013_vi_vim_ru

2013_vi_vim_ru

Published by faustkeller, 2017-09-07 00:23:54

Description: 2013_vi_vim_ru

Search

Read the Text Version

Обзор команд перемещения курсора в vi 65Ес­ли польз­ ов­ ат­ ель сов­ ерш­ ил ка­кое-ли­бо ред­ акт­ ир­ о­ва­ние, а за­тем пе­ре­мест­ ил курс­ ор ком­ анд­ ой, от­лич­ной от G, то ком­ ан­да `` вер­нет кур­сор наме­сто по­след­ней прав­ки. Есл­ и вы вы­зы­вал­ и ко­манд­ у по­иск­ а (/ или ?),то `` верн­ ет курс­ ор на мес­ то на­чал­ а это­го по­ис­ка. Пар­ а апос­ т­роф­ ов ('')раб­ от­ ае­ т почт­ и так же, как и пар­ а об­ратн­ ых ка­выч­ ек, но пер­ ен­ ос­ ит кур­сор не на его пре­ды­ду­щее ме­сто в строк­ е, а на на­чал­ о этой стро­ки.Об­щее чис­ло строк, ото­браж­ ае­мое при на­жа­тии CTRL-G, мо­жет датьпри­мерн­ ое пред­ставл­ е­ние о том, на сколь­ко строк сле­дуе­ т пер­ е­мест­ ить­ся. Есл­ и вы нах­ о­дит­ есь в 10-й стро­ке файл­ а из 1 000 строк: \"practice\" line 10 of 1000 --1%--и хо­ти­те нач­ ать ре­дак­тир­ о­ва­ние где-то око­ло его конц­ а, то при­мер­ноерас­пол­ ож­ е­ние ваш­ ей це­ли бу­дет за­да­ватьс­ я ком­ анд­ ой 800G.Пе­ре­ме­щен­ ие по но­ме­ру строки – хор­ о­ший спо­соб быс­ т­рог­ о пер­ ех­ од­ ав больш­ их фай­лах.Обзор команд перемещения курсора в vi В табл. 3.1 соб­ ­ра­ны ко­ман­ды, расс­ мот­ренн­ ые в этой гла­ве. Таб­ли­ца 3.1. Ко­манд­ ы пер­ е­мещ­ ен­ ияПе­ре­ме­ще­ние Ком­ анд­ аПро­лис­тать впер­ ед на один экр­ ан ^FПрол­ ис­тать наз­ ад на один эк­ран ^BПрол­ ис­тать впер­ ед на полэ­ кр­ ан­ а ^DПрол­ ис­тать наз­ ад на полэ­ к­ран­ а ^UПро­лис­тать впе­ред на од­ну строк­ у ^EПро­лис­тать наз­ ад на одн­ у строк­ у ^YПер­ ем­ ес­тить тек­ у­щую строк­ у нав­ ерх эк­ран­ а и прол­ ис­тать z ENTERПе­ре­мес­тить те­кущ­ ую стро­ку в центр эк­ра­на и прол­ ис­тать z.Пер­ ем­ ес­тить те­ку­щую строк­ у вниз эк­ран­ а и прол­ ис­тать z-Пе­рер­ и­сов­ ать экр­ ан ^LПер­ ейт­ и в са­мую верх­нюю стро­ку эк­ра­на HПер­ ейт­ и в средн­ юю стро­ку эк­ран­ а MПе­рейт­ и в сам­ ую ниж­нюю стро­ку эк­ра­на LПер­ ей­ти на перв­ ый симв­ ол сле­дующ­ ей стро­ки ENTERПе­рей­ти на перв­ ый сим­вол след­ ую­щей строк­ и +Пе­рейт­ и на пер­вый сим­вол пре­ды­ду­щей строк­ и -Пе­рей­ти на перв­ ый не­пуст­ ой сим­вол те­ку­щей строк­ и ^

66 Глава 3. Быстрое перемещение Табл­ и­ца 3.1 (продолжение)Пер­ е­ме­ще­ние Ко­манд­ аПе­рей­ти на n-й столб­ ец те­ку­щей строк­ и n|Пе­рей­ти в ко­нец слов­ а eПе­рей­ти в кон­ ец слов­ а (иг­нор­ ир­ уя знак­ и пре­пин­ а­ния) EПе­рейт­ и к на­ча­лу тек­ у­щег­ о предл­ ож­ е­ния (Пер­ ейт­ и к на­ча­лу след­ ующ­ ег­ о пред­ло­же­ния )Пер­ ей­ти к нач­ а­лу те­ку­ще­го абзаца {Пер­ ей­ти к на­чал­ у сле­дующ­ е­го абзаца }Пер­ ейт­ и к нач­ ал­ у тек­ ущ­ е­го раз­дел­ а [[Пер­ ей­ти к на­ча­лу след­ ующ­ е­го раз­де­ла ]]Ис­кать ниж­ е по текс­ ту с ис­польз­ ов­ а­ние­ м шабл­ о­на /patternИск­ ать выш­ е по тек­сту с ис­польз­ ов­ а­ние­ м шаб­лон­ а ?patternПо­вто­рить пос­ лед­ний пои­ ск nПов­ то­рить пос­ ледн­ ий пои­ ск в про­тив­ о­по­лож­ном нап­ рав­ле­нии NПо­вто­рить пос­ лед­ний по­иск ниж­ е по текс­ ту /Пов­ то­рить пос­ ледн­ ий по­иск выш­ е по текс­ ту ?Пер­ ей­ти на сле­дую­щее вхож­ д­ ен­ ие x в тек­ ущ­ ей строк­ е fxПе­рейт­ и на пре­дыд­ у­щее вхож­ д­ е­ние x в те­кущ­ ей строк­ е FxПе­рейт­ и на симв­ ол пе­ред след­ ую­щим вхо­ж­де­ни­ем x в тек­ у­щей txстро­кеПер­ ей­ти на симв­ ол пос­ ле пре­ды­ду­ще­го вхож­ д­ е­ния x в тек­ ущ­ ей Txстрок­ еПо­втор­ ить пос­ лед­нюю ко­ман­ду пои­ с­ка в том же на­правл­ ен­ ии ;По­втор­ ить по­след­нюю ко­манд­ у пои­ с­ка в прот­ ив­ оп­ о­лож­ном ,нап­ рав­лен­ ииПер­ ейт­ и на за­данн­ ую стро­ку n nGПе­рей­ти в ко­нец фай­ла GВер­нутьс­ я к пре­ды­ду­щей метк­ е или конт­ екс­ ту ``Верн­ уть­ся на нач­ а­ло строк­ и, со­держ­ ащ­ ей пре­дыд­ у­щую метк­ у ''Пок­ а­зать инф­ орм­ ац­ ию о те­ку­щей строк­ е (не ко­манд­ а пер­ ем­ е­ще­ ^Gния)

4 За рамками основ Глава 4.Вы уже поз­ на­ком­ и­лись с осн­ ов­ны­ми ко­манд­ а­ми ред­ ак­ти­ров­ ан­ ия vi: i,a, c, d и y, и в этой глав­ е ваш­ и зна­ния расш­ ир­ ятс­ я. Она ох­ват­ ы­ва­ет:• Опис­ ан­ ие доп­ ол­ни­тель­ных средств ред­ ак­ти­ров­ а­ния, включ­ ая обз­ ор общ­ ей фор­мы ко­манд­ ы.• До­полн­ ит­ ель­ные спос­ о­бы вхо­да в vi.• Ра­бо­ту с буф­ ер­ а­ми, со­дер­жащ­ им­ и скоп­ и­ров­ анн­ ые и удал­ енн­ ые фраг­ мен­ты.• От­метк­ у ваш­ е­го по­ло­жен­ ия в файл­ е.Другие сочетания командВ глав­ е 2 вы изу­чил­ и ко­манд­ ы ре­дак­ти­ров­ а­ния c, d и y, а такж­ е нау­ чи­лись со­че­тать их с пер­ е­ме­ще­ние­ м и чи­сло­вы­ми арг­ у­мент­ а­ми (на­при­мер,2cw или 4dd). В глав­ е 3 мы доб­ а­вил­ и в ва­шу ко­пил­ку больш­ ое ко­ли­чес­ т­во ком­ анд пер­ ем­ ещ­ ен­ ия. Хот­ я воз­можн­ ость со­вмещ­ е­ния ком­ анд ред­ ак­тир­ о­ван­ ия и пе­рем­ е­ще­ния для вас уже не нов­ а, табл. 4.1 поз­ во­ляе­ т уви­деть все разн­ о­об­раз­ ие вар­ и­ан­тов правк­ и тек­ста.Об­рат­ и­те вним­ ан­ ие, что все пос­ лед­ ов­ а­тельн­ ос­ ти ком­ анд в табл. 4.1 от­веч­ аю­ т след­ ующ­ ем­ у фор­мат­ у: (number)(command)(text object)number – это не­обяз­ ат­ ель­ный чис­ лов­ ой ар­гум­ ент. Для рас­смат­ри­вае­мых случ­ а­ев command – это ком­ анд­ ы c, d и y, а text object – ко­манд­ а пе­ре­мещ­ е­ния.Об­щий вид ко­манд vi об­су­ж­далс­ я в глав­ е 2 (их пе­реч­ ень ука­зан в табл. 2.1и 2.2).

68 Глава 4. За рамками основТабл­ иц­ а 4.1. Но­вые ком­ ан­ды ред­ ак­ти­ров­ а­нияИз­ме­нить Уда­лить Коп­ ир­ ов­ ать От кур­со­ра до...cH dH yH вер­ха эк­ран­ аcL dL yL низ­ а экр­ ан­ аc+ d+ y+ сле­дую­щей строк­ иc5| d5| y5| 5-го столбц­ а в след­ ую­щей строк­ е2c) 2d) 2y) 2-г­ о пред­ло­жен­ ия ниж­ е по тек­стуc{ d{ y{ пред­ ы­ду­ще­го абзацаc/pattern d/pattern y/pattern шаб­ло­на patterncn dn yn след­ ую­щег­ о вхо­жд­ е­ния patterncG dG yG конц­ а файл­ аc13G d13G y13G стро­ки ном­ ер 13Варианты запуска vi До сих пор вы зап­ ус­ка­ли ред­ ак­тор vi та­кой ко­манд­ ой: $ vi file У ком­ анд­ ы vi есть и дру­гие по­лезн­ ые опц­ ии. На­при­мер, мож­но отк­ рыть файл на оп­ред­ ел­ ен­ной строк­ е, или с по­ис­ком по ука­зан­но­му шабл­ о­ну, или толь­ко для чте­ния. Еще одн­ а опц­ ия вос­стан­ ав­ли­вае­ т из­мен­ ен­ ия в фай­ле, кот­ ор­ ый ред­ ак­ти­ро­вал­ся в мо­мент сбоя сис­тем­ ы.Переход на указанную позицию Мож­но от­крыть файл и  пер­ ей­ти на перв­ ое вхо­жд­ ен­ ие шаб­ло­на или стро­ку с оп­ре­де­лен­ным но­мер­ ом, а такж­ е указ­ ать ис­ход­ное пе­рем­ е­ще­ ние ли­бо пои­ ск­ ом, либ­ о по но­ме­ру стро­ки прям­ о в ко­манд­ной стро­ке1: $ vi +n file От­кро­ет file на строк­ е n. $ vi + file Отк­ рое­ т file на по­след­ней строк­ е. $ vi +/pattern file Отк­ рое­ т file на перв­ ом вхо­жд­ ен­ ии pattern. В фай­ле practice для отк­ ры­тия фай­ла и пер­ ех­ од­ а на строк­ у со сло­вом Screen введ­ ит­ е: 1 Со­гласн­ о станд­ арт­ у POSIX, вме­сто пок­ а­занн­ ой здесь ком­ анд­ ы +command vi долж­ ен ис­польз­ ов­ ать -c command. Как прав­ и­ло, в цел­ ях об­ратн­ ой сов­ мес­ти­ мос­ ти ра­бот­ а­ют обе верс­ ии.

Варианты запуска vi 69Клав­ и­ши Ре­зуль­татvi +/Screen practice With a screen editor you can scroll the page, move the cursor, delete lines, and insert characters, while seeing the results of your edits as you make them. Screen editors are very popular, since they allow you to make changes as you read Пе­ре­дач­ а опц­ ии +/pattern ко­ман­де vi и пе­ре­ход к стро­ ке со сло­вом Screen.Как видн­ о в этом при­ме­ре, шабл­ он ваш­ е­го по­ис­ка не обя­зат­ ель­но ока­жет­ся в са­мом вер­ху экр­ ан­ а. Ес­ли в шабл­ он­ е есть про­бел­ ы, то не­обх­ о­ди­мо зак­ люч­ ить весь шабл­ он в один­ арн­ ые или двой­ные ка­вычк­ и1: +/\"you make\"или по­ста­вить обр­ атн­ ую ко­сую черт­ у пе­ред проб­ е­лом: +/you\ makeКром­ е тог­ о, ес­ли вы хо­тит­ е исп­ оль­зо­вать станд­ артн­ ый синт­ ак­сис дляшабл­ о­нов, опи­санн­ ый в гла­ве 6, то, скор­ ее все­го, вам прид­ ет­ся экр­ ан­ и­ров­ ать спец­ иа­ льн­ ые симв­ о­лы с прим­ е­не­ни­ем кав­ ыч­ ек или обр­ ат­ной ко­сой чер­ты, чтоб­ ы обо­лоч­ка не ин­терп­ ре­ти­ро­ва­ла их по-сво­ему.Ис­поль­зов­ ан­ ие опц­ ии +/pattern буд­ ет пол­ езн­ ым, ес­ли вам приш­ лосьвыйт­ и из сеа­ нс­ а ред­ ак­тир­ о­ва­ния до оконч­ ан­ ия ра­бот­ ы. В этом случ­ аемож­ е­те пом­ е­тить те­ку­щее мес­ то в  фай­ле, встав­ ив спе­циа­ льн­ ый шаб­лон, на­при­мер ZZZ или HERE. Пов­ тор­но верн­ увш­ ись к фай­лу, нужн­ о буд­ етлишь вве­сти /ZZZ или /HERE для пер­ е­хо­да к мес­ту оконч­ ан­ ия пре­ды­ду­щег­ о сеа­ нс­ а раб­ от­ ы. Как прав­ и­ло, при раб­ от­ е в vi оп­ция wrapscan включ­ е­на. Есл­ и в ва­ ших на­стройк­ ах оп­ция wrapscan все­гда вык­ люч­ ен­ а (см. «Пов­ торн­ ый пои­ ск» на стр. 61), то вы не смо­же­те восп­ оль­зов­ ать­ся +/pattern. При попыт­ке отк­ рыт­ ия фай­ла с этой оп­цие­ й vi пом­ ес­тит кур­сор на по­ следн­ юю строк­ у и ото­браз­ ит соо­ б­щен­ ие «Address search hit BOT­ TOM without matching pattern».Режим «только для чтения» Бы­ваю­ т случ­ аи, ког­ да нуж­но про­смот­реть файл и при этом за­щи­тить его от случ­ айн­ ых из­ме­нен­ ий (нап­ рим­ ер, ес­ли вы за­хот­ ит­ е от­крыть боль­шой файл для тре­нир­ ов­ки ко­манд пер­ е­мещ­ ен­ ия vi ли­бо про­лис­ тать ком­ андн­ ый файл или текст про­грамм­ ы). Вы мож­ е­те от­крыть файл 1 На­лич­ ие кавычек – это тре­бо­ва­ние обо­лочк­ и, а не vi.

70 Глава 4. За рамками основ в реж­ им­ е «тольк­ о для чтен­ ия» (read-only), пе­рем­ ещ­ атьс­ я по не­му с по­ мощ­ ью люб­ ых ко­манд пер­ ем­ е­щен­ ия, но не иметь воз­можн­ ос­ ти внес­ ти изм­ е­нен­ ия в файл. Для этог­ о введ­ и­те ли­бо: $ vi -R file ли­бо $ view file (Ком­ анд­ а view, под­ обн­ о ко­манд­ е vi, мо­жет со­пров­ ож­ ­датьс­ я лю­бы­ми оп­ ци­ями для указ­ ан­ ия оп­ре­де­лен­ног­ о мест­ а в  тек­сте1.) Ес­ли вы ре­шит­ е сдел­ ать из­ме­не­ния в файл­ е, то мож­но от­мен­ ить реж­ им «толь­ко для чте­ ния», добавив к ком­ ан­де со­хран­ ен­ ия вос­клиц­ ат­ ель­ный знак: :w! или: :wq! При возн­ икн­ ов­ ен­ ии проб­ лем с сох­ ран­ ен­ и­ем файл­ а об­ра­ти­тесь к пер­ еч­ ню возм­ ожн­ ых проб­ лем, при­вед­ енн­ ом­ у в при­ло­жен­ ии C.Восстановление буфера Иног­ да во вре­мя ре­дак­ти­ров­ а­ния файл­ а мо­жет прои­ зойт­ и от­каз сист­ е­ мы. Обычн­ о в этом случ­ ае все изм­ е­нен­ ия, сде­ланн­ ые в фай­ле пос­ ле по­ следн­ ей зап­ и­си (сох­ ран­ е­ния), тер­ яю­ т­ся. Одн­ а­ко сущ­ е­ств­ уе­ т оп­ция -r, поз­ во­ляющ­ ая вос­стан­ о­вить буф­ ер, кот­ ор­ ый вы ре­дакт­ и­ров­ а­ли во вре­мя сист­ ем­но­го сбоя. В  трад­ иц­ и­онн­ ой сист­ е­ме UNIX с  ори­ги­наль­ным vi при пер­вом вхо­де в сист­ е­му по­сле сбоя вы пол­ уч­ ае­те почт­ ов­ ое соо­ б­ще­ние, где го­вор­ ит­ся, что буф­ ер со­хран­ ен. Кроме того, ес­ли вве­сти ком­ анд­ у: $ ex -r или: $ vi -r то мож­но по­луч­ ить спис­ ок всех файл­ ов, со­хран­ ен­ных сис­те­мой. Для вос­стан­ овл­ ен­ ия ред­ ак­ти­руе­мо­го бу­фер­ а исп­ ольз­ уйт­ е опц­ ию -r вме­ сте с име­нем файл­ а. Нап­ рим­ ер, что­бы восс­ тан­ ов­ ить ре­дак­тир­ уем­ ый бу­ фер фай­ла practice по­сле сист­ емн­ о­го сбоя, введ­ ит­ е: $ vi -r practice Це­лес­ о­об­разн­ о восс­ тан­ ов­ ить файл сраз­ у же, чтоб­ ы не сде­лать в нем слу­ чайн­ ых прав­ ок, а за­тем вы­бир­ ать меж­ду сох­ ра­нен­ным бу­фер­ ом и толь­ ко что от­ред­ акт­ и­ро­ванн­ ым файл­ ом. Ком­ ан­дой :pre (со­кра­ще­ние от :preserve) мож­но зас­ та­вить сис­те­му со­ хран­ ять бу­фер, даж­ е ко­гда ник­ ак­ о­го сбоя нет. Это мож­ ет ока­зать­ся по­ 1 Как пра­ви­ло, view – это про­сто ссыл­ка на vi.

Использование буферов 71лез­ным, ког­ да вы сдел­ а­ли изм­ ен­ е­ния в файл­ е и об­нар­ у­жи­ли, что не мо­же­те сох­ ран­ ить его из-за от­сутс­ тв­ ия прав на за­пись. (В этом случ­ ае мож­н­ о так­же за­пис­ ать ко­пию фай­ла под друг­ им име­нем либ­ о в кат­ а­лог, гдеу вас есть прав­ а на за­пись. См. «Про­блем­ ы при сох­ ран­ е­нии файл­ ов» настр. 30.) В раз­ных вер­сия­ х и мод­ и­фи­кац­ и­ях vi восс­ та­новл­ ен­ ие ра­бот­ а­ет по- разн­ о­му, по­это­му луч­ше все­го обратитьс­ я к лок­ аль­ной до­кум­ ент­ а­ ции. vile во­об­ще не подд­ ерж­ и­ва­ет вос­стан­ ов­ле­ние. Сог­ ласн­ о его до­ ку­мент­ а­ции ре­ком­ ен­дуе­ т­ся ис­поль­зов­ ать оп­ции autowrite и autos­ave. О том, как это дел­ а­ет­ся, чит­ ай­те в раз­де­ле «На­строй­ка vi» на стр. 117.Использование буферов Вы уже ви­де­ли, что во вре­мя ре­дак­тир­ ов­ а­ния пос­ ледн­ ее удал­ е­ние (d или x) или ко­пи­ров­ ан­ ие (y) со­хран­ я­лось в бу­фе­ре1 (спе­ци­аль­но отв­ е­денн­ ой об­ лас­ти па­мят­ и). Вы мо­жет­ е обр­ а­щать­ся к сод­ ерж­ и­мом­ у этог­ о буф­ ер­ а и ко­ ман­дой встав­ки (p или P) пом­ е­щать со­хран­ ен­ный текст об­рат­но в файл. vi сох­ ра­няе­ т пос­ ледн­ ие де­вять уда­ле­ний в  ну­ме­ро­ван­ных бу­фер­ ах. К люб­ о­му из них можн­ о об­рат­ итьс­ я, что­бы восс­ та­но­вить как­ ое-либ­ о из по­след­них де­вя­ти удал­ ен­ ий (или все сра­зу). (Неб­ оль­шие уда­ленн­ ые фраг­мент­ ы, сос­ тав­ляющ­ ие неполн­ ую стро­ку, не хран­ ят­ся в нум­ ер­ о­ван­ ных бу­фе­рах. Их можн­ о восс­ тан­ ов­ ить толь­ко ком­ ан­да­ми p или P сра­зу пос­ ле уда­лен­ ия.) vi так­же поз­ во­ля­ет по­ме­щать скоп­ ир­ о­ванн­ ый ком­ анд­ ой y текст в бу­фе­ ры под опр­ е­дел­ ен­ным­ и име­нам­ и. Вы мо­же­те зад­ ейс­ т­во­вать до 26 (a–z) бу­фе­ров, сод­ ер­жащ­ их ско­пи­ро­ванн­ ый текст, и  восс­ тан­ авл­ ив­ ать этот текст ком­ ан­дой встав­ки p в лю­бой мо­мент сеа­ нс­ а ред­ акт­ и­ро­ван­ ия.Восстановление удалений Возм­ ожн­ ость уда­лять больш­ ие куск­ и текс­ та по­лез­на, но что ес­ли вы по ошиб­ке удал­ и­ли 53 нужн­ ых вам стро­ки? Можн­ о вос­стан­ о­вить люб­ ое из де­вят­ и по­след­них уда­лен­ ий, так как они сох­ ра­не­ны в ну­мер­ о­ванн­ ых бу­ фе­рах. Пос­ ледн­ ее хра­нитс­ я в буф­ е­ре 1, предпоследнее – в бу­фе­ре 2 и т. д. Что­бы восс­ та­нов­ ить удал­ е­ние, вве­дит­ е \" (двойн­ ую кав­ ыч­ку), ука­жи­те но­мер буф­ е­ра для вос­стан­ овл­ ен­ ия, а за­тем вве­дит­ е ком­ ан­ду вставк­ и p. Так, для восс­ та­новл­ е­ния пред­по­следн­ ег­ о уда­ле­ния наб­ ер­ ит­ е: \"2p Уда­лен­ный текст из буф­ е­ра 2 буд­ ет пом­ ещ­ ен по­сле курс­ о­ра. 1 Не пу­тай­те его с буф­ ер­ ом из пред­ ы­дущ­ ег­ о разд­ ел­ а: здесь речь идет о спе­ци­ альн­ о вы­дел­ енн­ ой об­лас­ти пам­ ят­ и для врем­ енн­ о­го хра­не­ния (об­мен­ а) ин­ форм­ ац­ ии; в пре­дыд­ ущ­ ем­ раз­де­ле речь о со­держ­ им­ ом фай­ла, отк­ ры­том в vi и в данн­ ый мо­мент на­хо­дя­щемс­ я в ОЗУ. – Прим. на­уч. ред.

72 Глава 4. За рамками основ Ес­ли вы не уве­рен­ ы, как­ ой именн­ о бу­фер со­дер­жит нуж­ный текст, не­ обяз­ ат­ ельн­ о раз за раз­ ом вво­дить \"np. Ком­ ан­да пов­ тор­ е­ния (.) в соч­ е­та­ нии с p по­сле u авт­ ом­ ат­ и­чес­ ки уве­лич­ ит но­мер буф­ ер­ а. В рез­ уль­та­те вы смож­ е­те ис­кать в ну­мер­ ов­ анн­ ых буф­ ер­ ах, исп­ оль­зуя: \"1pu.u.u и т. д. чтоб­ ы пом­ е­щать со­дер­жим­ ое кажд­ ог­ о из по­сле­дую­щих бу­фер­ ов в файл один за друг­ им. Каж­дый раз при вво­де u вос­стан­ овл­ ен­ный текст ис­чез­ а­ ет, а ког­ да вы наб­ и­рае­те точ­ку (.), в файл встав­ля­етс­ я со­дер­жим­ ое сле­ дующ­ ег­ о бу­фе­ра. Пов­ то­ряй­те ввод u и ., по­ка не вос­стан­ о­ви­те нуж­ный фраг­мент.Копирование в именованный буфер Вы уже знает­ е, что вста­вить сод­ ер­жи­мое неи­ ме­нов­ анн­ о­го буф­ е­ра (ко­ ман­да­ми p или P) мож­но толь­ко до внес­ е­ния дру­гих изм­ ен­ ен­ ий в файл, инач­ е этот бу­фер бу­дет пе­рез­ а­пис­ ан. Такж­ е мож­но применить y и d со­ вме­ст­но с 26 имен­ о­ванн­ ы­ми буф­ ер­ ам­ и (от a до z), исп­ оль­зуе­мым­ и спе­ циа­ ль­но для коп­ и­ров­ ан­ ия и пер­ е­мещ­ е­ния тек­ста. Есл­ и вы прис­ вои­ли имя буф­ ер­ у, что­бы сох­ ра­нить скоп­ и­ров­ анн­ ый текст, то мож­но зап­ ро­ сить его сод­ ерж­ и­мое в люб­ ой мо­мент се­ан­са ред­ акт­ и­ров­ а­ния. Что­бы ско­пи­ро­вать текст в имено­ ванный бу­фер, по­ставьт­ е пе­ред ко­ман­ дой коп­ и­ро­ва­ния y двойн­ ую ка­вычк­ у (\") и бу­кв­ у, за­даю­щую имя буф­ е­ ра, в ко­тор­ ый вы хо­тит­ е ско­пи­ро­вать текст. На­при­мер: \"dyy Коп­ ир­ о­вать тек­ ущ­ ую строк­ у в буф­ ер d. \"a7yy Коп­ ир­ о­вать след­ ую­щие семь строк в буф­ ер a. Пос­ ле заг­ рузк­ и текс­ та в име­нов­ ан­ные бу­фер­ ы и пер­ ем­ е­щен­ ия в дру­гой фрагм­ ент восп­ ольз­ уйт­ есь p или P, что­бы встав­ ить текст: \"dP По­мест­ ить сод­ ерж­ и­мое бу­фер­ а d пе­ред кур­сор­ ом. \"ap По­мес­тить сод­ ерж­ и­мое бу­фер­ а a по­сле кур­со­ра. По­мест­ ить часть бу­фер­ а не получится – его сод­ ерж­ им­ ое встав­ляе­ тс­ я толь­ко це­ли­ком. В  сле­дую­щей гла­ве вы поз­ на­ко­мит­ есь с  ре­дакт­ и­ров­ ан­ ие­ м не­скольк­ их файл­ ов. На­учивш­ ись пер­ ек­ люч­ атьс­ я межд­ у фай­ла­ми без вых­ од­ а из vi, вы смо­жет­ е применять име­нов­ анн­ ые буф­ е­ры для выб­ ор­ очн­ ой пер­ е­дач­ и текс­ та межд­ у фай­лам­ и. А есл­ и вы поль­зует­ есь функ­ци­ей мно­гоо­ кон­но­ го ре­дак­тир­ о­ван­ ия в  кло­нах vi, то так­же смо­же­те ис­польз­ о­вать для этой цел­ и не­имен­ ов­ анн­ ый буф­ ер. Так­же мож­но удал­ ять текст в име­нов­ анн­ ые бу­фер­ ы. При этом исп­ оль­ зуе­ т­ся пох­ о­жая конс­ т­рук­ция: \"a5dd Уда­лить пять строк в бу­фер a. Есл­ и на­пис­ ать имя буф­ ер­ а с про­пис­ной бук­ ­вы, то ско­пир­ о­ванн­ ый или удал­ ен­ный текст бу­дет при­сое­ ди­нен к тек­ ущ­ ем­ у сод­ ерж­ им­ о­му этог­ о бу­

Отметка места 73 фер­ а. Это дае­ т больш­ е прос­ тор­ а в ко­пи­ров­ ан­ ии или пер­ е­мещ­ е­нии. На­ при­мер: \"zd) Уда­лить от курс­ ор­ а до конц­ а тек­ у­ще­го предл­ ож­ ен­ ия и  сох­ ран­ ить в бу­фер­ е z. 2) Пер­ ей­ти на два пред­ло­же­ния ниж­ е. \"Zy) Доб­ а­вить нов­ ое пред­лож­ ен­ ие в буф­ ер z. Вы мож­ е­те и дальш­ е до­бав­ лять текст в именованный буф­ ер, но имей­те в вид­ у, что ес­ли вы хоть раз заб­ у­де­тесь и  скоп­ и­рует­ е или удал­ ит­ е текст в  бу­фер, указ­ ав его имя строч­ной бук­ в­ ой, то пер­ е­за­пиш­ ет­ е бу­фер и тем са­мым по­тер­ яет­ е все, что был­ о в нем на­коп­ ­ле­но.Отметка места В vi можн­ о пом­ е­чать свое пол­ о­же­ние в файл­ е не­вид­ им­ ой «за­кладк­ ой», что­бы по­сле ра­бо­ты с  друг­ им­ и фрагм­ ен­та­ми тек­ста мож­но был­ о вер­ нуть­ся на эту метк­ у. В ком­ андн­ ом реж­ им­ е введ­ ит­ е: mx Эта ком­ ан­да ста­вит метк­ у x на тек­ у­щую по­зиц­ ию (x мож­ ет быть лю­ бой бук­ ­вой). За­ме­тим, что перв­ он­ ач­ аль­ная вер­сия vi до­пус­ка­ла ис­ поль­зов­ ан­ ие толь­ко строч­ных букв. В  Vim проп­ исн­ ые и  строчн­ ые бук­ в­ ы раз­лич­ а­ютс­ я. 'x (Апо­ст­роф). Пом­ е­щае­ т кур­сор на пер­вый симв­ ол стро­ки с метк­ ой x. `x (Об­ратн­ ая кав­ ычк­ а). По­ме­щае­ т курс­ ор на симв­ ол, по­меч­ енн­ ый как x. `` (Об­рат­ные ка­выч­ки). Возв­ ра­щае­ т в точ­нос­ ти на пред­ ыд­ у­щую мет­ку1 или в кон­текст. '' (Апо­ст­роф­ ы). Возв­ ращ­ ае­ т на на­ча­ло стро­ки, сод­ ерж­ ащ­ ей пре­дыд­ у­ щую мет­ку или кон­текст. Мет­ки ус­та­нав­лив­ а­ют­ся толь­ко для тек­ ущ­ е­го сеа­ нс­ а vi и не сох­ ра­ ня­ют­ся в файл­ е.1 Авт­ ор исп­ ольз­ уе­ т тер­мин «пред­ ы­ду­щая мет­ка» (previous mark) для обо­зна­ чен­ ия мес­та, в  кот­ о­ром нах­ од­ ил­ся курс­ ор до вып­ ол­нен­ ия ка­кой-либ­ о ко­ ман­ды пер­ ех­ о­да. – Прим. нау­ ч. ред.

74 Глава 4. За рамками основДругие продвинутые команды редактирования Сущ­ ес­ тв­ ую­ т и иные ко­манд­ ы прод­ вин­ ут­ ог­ о ре­дак­тир­ ов­ а­ния, но для их исп­ оль­зо­ва­ния вам сна­чал­ а нужн­ о нем­ но­го узн­ ать о ред­ ак­то­ре ex, о ко­ то­ром расс­ каз­ а­но в сле­дующ­ ей гла­ве.Обзор команд vi для работы с буфером и меткамиВ табл. 4.2 прив­ ед­ ен­ ы опц­ ии ком­ андн­ ой стро­ки vi, об­щие для всех вер­сий ре­дак­то­ра. В табл. 4.3 и 4.4 предс­ тав­лен­ ы ко­манд­ ы ра­бо­ты с буф­ е­ром и метк­ а­ми.Таб­ли­ца 4.2. Опц­ ии ко­мандн­ ой стро­киКом­ ан­да Зна­че­ние+n file Отк­ ры­вае­ т файл file на строк­ е с но­мер­ ом n.+ file+/pattern file Отк­ ры­ва­ет файл file на по­след­ней строк­ е.-c command file Отк­ рыв­ ае­ т файл file на перв­ ом вхож­ д­ е­нии шабл­ о­на (в POSIX-R исп­ ольз­ уе­ тс­ я -c).-r Вы­пол­няе­ т ком­ ан­ду command пос­ ле отк­ ры­тия фай­ла file. Как пра­вил­ о, это пе­ре­ход на оп­ре­де­ленн­ ую стро­ку или по­иск (POSIX-вер­сия +). Вклю­ча­ет реж­ им «тольк­ о для чте­ния» (то же, что и выз­ ов view вме­сто vi). Вос­ста­нав­лив­ а­ет файл по­сле сбоя.Табл­ и­ца 4.3. Имен­ а бу­фе­ровИмя буф­ е­ра Ис­польз­ ов­ ан­ ие буф­ е­ра1–9 Пос­ лед­ние де­вять удал­ е­ний (чем больш­ е но­мер, тем стар­шеa–z уда­лен­ ие). Име­нов­ ан­ные буф­ е­ры. Проп­ ис­ные бу­к­вы доб­ авл­ я­ют текст в буф­ ер.Табл­ и­ца 4.4. Ком­ анд­ ы раб­ о­ты с бу­фер­ ом и мет­ка­ми Ко­ман­да Знач­ е­ние \"b command Вып­ ол­нить ко­манд­ у command c буф­ ер­ ом b. mx По­став­ ить метк­ у x на те­кущ­ ую по­зи­цию. 'x Пер­ е­мес­тить кур­сор на пер­вый сим­вол в строк­ е с мет­кой x. `x Пе­ре­мес­тить курс­ ор на сим­вол с метк­ ой x. `` Воз­вращ­ ае­ т на точ­ную по­зиц­ ию пре­дыд­ у­щей мет­ки или кон­тек­ста. '' Возв­ ра­ща­ет на нач­ а­ло строк­ и, сод­ ерж­ а­щей пре­ды­ду­щую метк­ у или кон­текст.

5 Введение в редактор ex Глава 5.Вы спрос­ ит­ е: ес­ли эта книг­ а расс­ ка­зы­ва­ет о vi, то за­чем вклю­чать в нееглав­ у о друг­ ом ре­дакт­ ор­ е? На са­мом де­ле, ex не со­всем друг­ ой ре­дак­тор.vi – это ви­зуа­ ль­ный реж­ им бол­ ее общ­ ег­ о, баз­ о­во­го стро­ко­вог­ о ре­дак­то­ра, ко­то­рым и явл­ яе­ т­ся ex. Не­кот­ о­рые его ком­ ан­ды мо­гут приг­ о­дить­сяпри раб­ о­те с vi и сэко­но­мить мно­го врем­ ен­ и. Мног­ ие из них мож­но ис­польз­ о­вать, не пок­ ид­ ая vi1.Вы уже знае­те, что файл можн­ о рас­сматр­ ив­ ать как наб­ ор про­ну­мер­ о­ван­ных строк. ex обесп­ е­чив­ а­ет поль­зов­ ат­ ел­ я бо­лее моб­ иль­ны­ми и мощ­ным­ и ко­ман­да­ми ре­дакт­ и­ров­ ан­ ия. С  его по­мо­щью вы смож­ ет­ е легк­ опер­ ем­ е­щатьс­ я меж­ду файл­ ам­ и и  пе­ре­дав­ ать текст из од­ног­ о фай­лав дру­гой множ­ ес­ тв­ ом спос­ об­ ов, а так­же быс­ тр­ о ре­дак­тир­ о­вать текс­ то­вые блок­ и, разм­ ер ко­тор­ ых боль­ше одн­ ог­ о экр­ а­на. Кром­ е тог­ о, с по­мо­щью гло­бальн­ ой зам­ е­ны мож­но сде­лать изм­ ен­ ен­ ие по зад­ анн­ ом­ у шаб­ло­ну во всем файл­ е.Эта глав­ а зна­ко­мит вас с ex и его ко­манд­ ам­ и. Вы уз­нае­те, как:• пер­ е­мещ­ ать­ся по фай­лу, исп­ оль­зуя ном­ ер­ а строк;• применять ко­манд­ ы ex, что­бы ко­пи­ров­ ать, пер­ е­мещ­ ать и  уда­лять текс­­ то­вые бло­ки;• сох­ ран­ ять файл­ ы или их части;• раб­ о­тать с не­сколь­ким­ и файл­ а­ми (счит­ ы­вать текст или ком­ ан­ды, пе­ рем­ е­щать­ся межд­ у файл­ а­ми).1 vile от­лич­ а­етс­ я от дру­гих мо­диф­ и­кац­ ий тем, что в нем не раб­ о­таю­ т мно­гие про­двин­ ут­ ые ко­манд­ ы ex. Подробное опи­са­ни­е каж­дой ко­манд­ ы приводит- ся в гла­ве 18.

76 Глава 5. Введение в редактор exКоманды ex За­долг­ о до изо­бре­те­ния vi или как­ ог­ о бы то ни бы­ло друг­ о­го экр­ анн­ ог­ о ред­ акт­ ор­ а лю­ди об­ща­лись с комп­ ью­ ­тер­ ом с по­мо­щью пе­чатн­ ых терм­ и­ на­лов, а не че­рез экр­ ан дис­плея (раст­ ров­ ый экр­ ан с уст­ройс­ т­вом по­зи­ цио­нир­ ов­ ан­ ия вро­де «мыш­ и» и  про­грамм­ а­ми эму­ля­ции терм­ ин­ а­ла). Но­мер­ а строк игр­ ал­ и роль ука­за­те­ля, поз­ во­ляв­ше­го знать, над ка­кой час­ тью фай­ла вы ра­бот­ ае­те. Стро­ков­ ые ре­дак­тор­ ы бы­ли адап­тир­ ов­ ан­ ы для ре­дак­тир­ ов­ ан­ ия по­доб­ных фай­лов. Прог­ рамм­ ист или дру­гой поль­ зо­ват­ ель комп­ ь­ют­ ер­ а рас­пе­ча­ты­вал стро­ку (или не­скольк­ о строк) в тер­ мин­ а­ле печ­ ат­ и, ввод­ ил ком­ анд­ ы для ред­ ак­тир­ ов­ а­ния именн­ о этой стро­ ки, зат­ ем печ­ а­тал зан­ ов­ о и про­ве­рял от­ре­дакт­ ир­ ов­ анн­ ую стро­ку. Пе­чат­ные терм­ ин­ ал­ ы уже дав­но ник­ то не при­мен­ я­ет, но не­кот­ ор­ ые из ко­манд ex до сих пор вос­треб­ ов­ ан­ ы польз­ о­ват­ е­лям­ и бол­ ее изо­щренн­ о­го ре­дак­тор­ а, пос­ тро­енн­ о­го на ба­зе ex. Хот­ я сам­ о ред­ акт­ ир­ ов­ ан­ ие прощ­ е вы­пол­нять в vi, орие­ нт­ ац­ ия ex на стро­ки да­ет больш­ ое пре­имущ­ ес­ тв­ о при шир­ о­ко­масш­ таб­ных изм­ е­нен­ и­ях в нес­ коль­ких час­тях файл­ а. Мног­ ие из ко­манд, с кот­ ор­ ы­ми мы встре­тим­ся в этой гла­ве, буд­ ут иметь в ка­че­ств­ е ар­гу­мент­ а имя фай­ла, поэ­ то­му не ре­ком­ ен­дуе­ т­ся да­вать файл­ ам име­на, сод­ ерж­ а­щие проб­ е­лы, хот­ я это и не зап­ ре­ще­ но. ex бу­дет сбит с тол­ку, а что­бы объя­ с­нить ему, что к чем­ у, по­тре­ буе­ т­ся ку­да больш­ е уси­лий, не­жел­ и след­ о­вал­ о бы уде­лять име­но­ва­ нию файл­ ов. Поль­зуйт­ есь знак­ ом под­черк­ ив­ ан­ ия, тир­ е или точ­ка­ ми, что­бы отд­ ел­ ять ком­пон­ ент­ ы в имен­ ах файл­ ов, и у вас бу­дет го­ разд­ о мень­ше про­блем. Пер­ ед тем как вы нач­нет­ е зап­ ом­ ин­ ать ко­манд­ ы ex (или, что не рек­ ом­ ен­ дуе­ т­ся, иг­но­ри­ро­вать их), дав­ айт­ е сна­ча­ла при­отк­ ро­ем зав­ ес­ у тайн­ ы над стро­ков­ ы­ми ред­ ак­тор­ а­ми. Есл­ и вы уви­дит­ е, как ра­бот­ а­ет ex при не­ пос­ ред­ст­вен­ном вы­зо­ве, то не­пон­ ят­ный синт­ ак­сис его ком­ анд ста­нет для вас бол­ ее ос­мыс­лен­ным. От­крой­те файл practice и  по­проб­ уй­те вы­пол­нить не­ко­то­рые ко­ман­ды ex. За­пуск ред­ ак­то­ра с файл­ ом сов­ ерш­ енн­ о анал­ ог­ ич­ ен по­доб­но­му дей­ ст­вию в vi. При выз­ о­ве ex вы увид­ ит­ е со­об­ще­ние с ин­фор­ма­ци­ей о пол­ ном ко­лич­ е­ст­ве строк в файл­ е и приг­ ла­шен­ ие в ви­де двое­то­чия. Нап­ ри­ мер: $ ex practice \"practice\" 6 lines, 320 characters : Пок­ а вы не скаж­ ет­ е ex ото­бра­зить стро­ки, вы не уви­ди­те ни одн­ ой стро­ ки этог­ о фай­ла. Ко­манд­ ы ex со­сто­ят из адр­ е­са строк­ и (обычн­ о это про­сто ее ном­ ер) и са­ мой ком­ ан­ды, зак­ анч­ и­ваю­щей­ся воз­врат­ ом ка­рет­ки (на­жат­ и­ем EN­TER). Од­ной из осн­ ов­ных команд явл­ яе­ тс­ я p (от print) для пе­чат­ и на эк­ран­ е.

Команды ex 77Нап­ ри­мер, ес­ли ввес­ ти в  ко­манд­ном приг­ ла­шен­ ии 1p, то вы увид­ ит­ епер­вую строк­ у фай­ла. :1p With a screen editor you can :Факт­ ич­ е­ски мож­но опуст­ ить p, так как но­мер стро­ки сам по се­бе эк­ви­вал­ ен­тен ко­манд­ е печ­ ат­ и для этой строк­ и. Что­бы вы­вес­ти бол­ ее од­нойстро­ки, ука­жи­те диап­ аз­ он ном­ е­ров строк (на­прим­ ер, 1,3 – два числ­ а,разд­ е­лен­ные зап­ я­ты­ми, без проб­ ел­ ов меж­ду ним­ и). Прим­ ерн­ о так: :1,3 With a screen editor you can scroll the page, move the cursor, delete lines, insert characters, and more,Ко­ман­да без но­мер­ а стро­ки опе­рир­ у­ет с тек­ ущ­ ей стро­кой. Так, ко­манд­ упод­ста­новк­ и (s), поз­ во­ляю­щую дел­ ать зам­ е­ну одн­ о­го сло­ва на друг­ ое,можн­ о ввес­ ти след­ ую­щим спос­ о­бом: :1 With a screen editor you can :s/screen/line/ With a line editor you canОбр­ ат­ и­те вним­ а­ние, что изм­ е­ненн­ ая стро­ка выв­ ел­ ась за­но­во пос­ ле вы­пол­нен­ ия ком­ ан­ды. Те же из­ме­нен­ ия можн­ о про­де­лать и друг­ им спос­ о­бом: :1s/screen/line/ With a line editor you canДаж­ е ес­ли вы бу­дет­ е поль­зо­ватьс­ я ко­ман­дам­ и ex из vi и не стан­ ет­ е вы­пол­нять их неп­ о­сред­ств­ ен­но, все-так­ и сто­ит уде­лить не­мно­го врем­ е­ниex как та­ков­ о­му. Вы уви­дит­ е, как имен­но след­ уе­ т ука­зы­вать ред­ ак­тор­ устрок­ у, с кот­ о­рой вы хот­ ит­ е ра­бот­ ать, и ка­кую ко­ман­ду вы­полн­ ить.Дав не­скольк­ о ко­манд ex в файл­ е practice, зап­ уст­ и­те vi с тем же фай­лом, чтоб­ ы увид­ еть его в бо­лее при­вычн­ ом ви­зуа­ ль­ном реж­ и­ме. Ком­ ан­да :vi пер­ ен­ ес­ ет вас из ex в vi.Что­бы выз­ вать ком­ ан­ду ex из vi, нужн­ о вве­сти спе­ци­аль­ный сим­вол: (двоет­ о­чие) для пер­ е­ход­ а в ниж­нюю строк­ у. За­тем наб­ е­рит­ е ко­ман­дуи на­жми­те ENTER, что­бы вы­полн­ ить ее. На­прим­ ер, в ред­ ак­тор­ е ex пе­рем­ ещ­ ен­ ие на стро­ку прои­ сх­ о­дит пу­тем вво­да ном­ е­ра этой стро­ки в при­глаш­ ен­ ии с двое­точ­ ие­ м. Чтоб­ ы пе­ре­мест­ итьс­ я на стро­ку 6 по­средс­ т­вомэтой ко­манд­ ы в vi, вве­ди­те: :6По­сле это­го наж­ ми­те ENTER.Пос­ ле след­ ующ­ е­го упр­ аж­не­ния мы об­суд­ им ком­ ан­ды ex с точ­ки зрен­ ияих вы­зов­ а из vi.

78 Глава 5. Введение в редактор exУпражнение: редактор exВ при­глаш­ е­нии ком­ анд­ной стро­ки UNIX ex practiceвыз­ ов­ и­те ре­дакт­ ор ex с файл­ ом practice:Поя­ витс­ я соо­ бщ­ е­ние: \"practice\" 6 lines, 320 charactersПер­ ейд­ и­те на перв­ ую стро­ку и на­печ­ ат­ ай­те :1(выв­ ед­ ит­ е):Нап­ еч­ ат­ айт­ е (вы­ве­дит­ е) строк­ и с 1 по 3: :1,3В строк­ е 1 сде­лайт­ е зам­ е­ну слов­ а screen: :1s/screen/lineВыз­ о­ви­те ред­ акт­ ор vi с этим файл­ ом: :viПер­ ей­ди­те на перв­ ую строк­ у: :1Перечень возможных проблем • Во врем­ я ре­дак­тир­ о­ва­ния в vi вы не­ожи­данн­ о поп­ а­ли в ре­дак­тор ex. Клав­ иш­ а Q, наж­ а­тая в  ко­манд­ном реж­ и­ме vi, выз­ ы­вае­ т ex. Поп­ ав в не­го, мож­но все­гда верн­ уть­ся в vi ко­манд­ ой vi.Редактирование в exМно­гие ком­ анд­ ы ре­дак­тир­ ов­ а­ния ex имею­ т бол­ ее про­стые в обр­ ащ­ ен­ иианал­ ог­ и в vi. Оче­вид­но, для удал­ ен­ ия од­но­го слов­ а или стро­ки вы буд­ е­те ис­польз­ ов­ ать dw или dd, а не ко­манд­ у delete из ex. Одн­ ак­ о ком­ ан­ды exудобн­ ы, ко­гда нужн­ о прои­ зв­ ес­ ти из­мен­ е­ния в нес­ кольк­ их строк­ ах. Онипоз­ вол­ яю­ т ме­нять боль­шие текс­ то­вые блок­ и все­го од­ной ком­ анд­ ой.Эти ком­ анд­ ы прив­ е­ден­ ы ниж­ е вме­сте с их абб­ рев­ иа­тур­ ам­ и. Помн­ ит­ е,что в vi пер­ ед кажд­ ой ко­манд­ ой ex нужн­ о ста­вить двое­точ­ ие. В зав­ ис­ и­мо­сти от то­го, что вам легч­ е зап­ омн­ ить, мож­ е­те ис­польз­ ов­ ать либ­ о сам­ уко­манд­ у, либ­ о ее сок­ ра­щен­ ие.Полн­ ое на­зван­ ие Со­кращ­ е­ние Знач­ ен­ иеdelete d Удал­ я­ет строк­ иmove m Пе­рем­ ещ­ ае­ т стро­киcopy co Коп­ ир­ у­ет строк­ и t Ко­пи­руе­ т строк­ и (анал­ ог co)Для обл­ ег­чен­ ия чте­ния ко­ман­ды ex мож­но раз­дел­ ять ее эле­мент­ ы про­бе­ла­ми. Нап­ рим­ ер, под­ об­ным обр­ аз­ ом можн­ о отд­ е­лять ад­рес­ а, шабл­ о­ны и ко­ман­ды. Тем не ме­нее нельз­ я исп­ ольз­ ов­ ать про­бел как раз­де­ли­тель внутр­ и шаб­лон­ а или в конц­ е ко­манд­ ы под­ста­новк­ и.

Редактирование в ex 79Адреса строк Каж­дой ком­ анд­ е ред­ ак­тир­ о­ва­ния ex не­обх­ о­дим­ о соо­ бщ­ ить ном­ ер стро­ ки (или строк), ко­то­рые бу­дут ре­дак­ти­ро­вать­ся. А ко­манд­ ам ex для ко­ пир­ ов­ ан­ ия и пе­рем­ ещ­ е­ния нужн­ о вдоб­ ав­ ок соо­ бщ­ ить, ку­да именн­ о вы хо­тит­ е пе­рем­ ест­ ить текст. Адр­ ес­ а строк мож­но за­дать не­сколь­ким­ и спос­ о­бам­ и: • яв­ным ука­зан­ и­ем ном­ ер­ а строк­ и; • симв­ о­ла­ми, ука­зы­вающ­ им­ и ном­ ер­ а строк от­нос­ и­тельн­ о те­кущ­ ей по­ зи­ции в файл­ е; • шаб­ло­нам­ и по­ис­ка в кач­ ес­ т­ве ад­ре­сов строк, на ко­то­рые бу­дет дейс­ т­ во­вать ко­ман­да. Расс­ мотр­ им не­скольк­ о прим­ ер­ ов.Определение диапазона строк Для яв­ног­ о зад­ а­ния диа­паз­ о­на строк мож­но ис­поль­зо­вать их ном­ е­ра. Ад­рес­ а, исп­ оль­зую­щие яв­ные ном­ ер­ а строк, наз­ ы­ва­ют­ся абс­ о­лют­ным­ и ад­ре­сам­ и строк. Нап­ рим­ ер: :3,18d Удал­ ить стро­ки с 3 по 18. :160,224m23 Пер­ ем­ ес­тить стро­ки с 160 по 224 сраз­ у пос­ ле стро­ки 23 (по­хож­ е на удал­ е­ние и встав­ку в vi). :23,29co100 Скоп­ и­ро­вать стро­ки с 23 по 29 и встав­ ить их пос­ ле стро­ки 100 (ана­ лог­ ич­но коп­ и­ро­ван­ ию и встав­ке в vi). Чтоб­ ы об­лег­чить ре­дакт­ и­ров­ а­ние с  пом­ о­щью но­ме­ров строк, можн­ о включ­ ить их ото­бра­же­ние в ле­вой част­ и экр­ а­на. Ко­манд­ а: :set number или ее сок­ ращ­ е­ние: :set nu пок­ а­жет ном­ е­ра строк. Файл practice при этом бу­дет вы­гля­деть так:1 With a screen editor2 you can scroll the page,3 move the cursor, delete lines,4 insert characters and moreПри зап­ и­си фай­ла ном­ ер­ а строк не со­хра­ня­ют­ся на дис­ке и не рас­пе­ча­тыв­ а­ют­ся на принт­ ер­ е. Они пе­рес­ тан­ ут ото­браж­ ать­ся пос­ ле вы­ход­ а изvi или от­ключ­ ен­ ия опц­ ии set:

80 Глава 5. Введение в редактор ex :set nonumber или :set nonu Чтоб­ ы вре­мен­но вы­вест­ и ном­ е­ра для наб­ о­ра строк, ис­польз­ уй­те знак #. Нап­ ри­мер, ком­ анд­ а: :1,10# пок­ аж­ ет ном­ ер­ а строк с 1 по 10. Как уже расс­ ка­зы­вал­ ось в гла­ве 3, ко­ман­да CTRL-G исп­ оль­зу­ет­ся для вы­вод­ а но­мер­ а те­кущ­ ей стро­ки. Та­ким обр­ аз­ ом, ес­ли пер­ ем­ ес­тить­ся на на­ча­ло бло­ка, наж­ ать CTRL-G, за­тем пер­ ей­ти в ко­нец блок­ а и на­жать CTRL-G еще раз, то мож­но оп­ред­ е­лить ном­ е­ра строк, со­от­вет­ст­вую­щих на­ча­лу и конц­ у тек­сто­во­го блок­ а. Еще один спос­ об узн­ ать но­мер строки – ко­ман­да ex =: := Вы­вод полн­ о­го чис­ла строк. :.= Вы­вод ном­ е­ра те­кущ­ ей стро­ки. :/pattern/= Вы­вес­ти ном­ ер сле­дующ­ ей строк­ и, ко­то­рая от­веч­ а­ет шабл­ о­ну pat­ tern.Символы адресации строк Для ад­ре­сац­ ии строк такж­ е мож­но исп­ оль­зов­ ать симв­ о­лы. Точ­ка (.) со­ от­ветс­ тв­ у­ет тек­ ущ­ ей строк­ е, симв­ ол $ обоз­ нач­ ае­ т пос­ лед­нюю стро­ку фай­ла, а знак % соо­ т­вет­ст­вуе­ т всем его строк­ ам. Ана­лог­ ич­ное зна­чен­ ие имее­ т соч­ ет­ ан­ ие 1,$. Эти симв­ о­лы мож­но комб­ и­ни­ров­ ать с абс­ о­лют­ны­ ми но­ме­ра­ми строк. Нап­ ри­мер, :.,$d Удал­ ен­ ие с тек­ ущ­ ей строк­ и до конц­ а файл­ а. :20,.m$ Пер­ ем­ ес­тить в кон­ ец фай­ла блок, сод­ ер­жа­щий строк­ и с 20-й по тек­ у­ щую. :%d Удал­ ить все стро­ки в фай­ле. :%t$ Скоп­ и­ро­вать все стро­ки и пом­ ест­ ить их в кон­ ец фай­ла (ис­ходн­ ое со­ держ­ и­мое файл­ а по­вто­рит­ся два раза).

Редактирование в ex 81 Кром­ е абс­ о­лют­ног­ о но­ме­ра стро­ки мож­но указ­ ы­вать адр­ ес по от­но­ше­ нию к  те­ку­щей строк­ е. Симв­ о­лы + и  - вы­пол­няю­ т со­отв­ етс­ т­вующ­ ие арифм­ ет­ и­че­ские опе­ра­ции. Есл­ и пос­ тав­ ить их пер­ ед числ­ ом, то оно бу­ дет доб­ авл­ ен­ о или выч­ тен­ о. На­прим­ ер: :.,.+20d Уда­лить тек­ ущ­ ую строк­ у и сле­дую­щие за ней 20 строк. :226,$m.-2 По­мес­тить строк­ и с 226-й до пос­ лед­ней в фай­ле сраз­ у пос­ ле стро­ки, рас­по­лож­ енн­ ой на две строк­ и выш­ е те­кущ­ ей. :.,+20# Ото­браз­ ить но­ме­ра строк с тек­ ущ­ ей до ле­жа­щей ниж­ е на 20 строк. Факт­ и­че­ски при исп­ ольз­ о­ван­ ии + или - точ­ку (.) ста­вить необяз­ а­тельн­ о, так как тек­ ущ­ ая стро­ка счи­та­етс­ я старт­ ов­ ой по­зи­ци­ей по умол­чан­ ию. Есл­ и по­сле + или - не ука­зать чис­ло, то они ста­нут экв­ ив­ ал­ ентн­ ым­ и +1 и  -1 соо­ т­ветс­ тв­ ен­но1. Ана­ло­гич­но ++ и  -- рас­шир­ я­ют диа­па­зон строк еще на одн­ у строк­ у, и т. д. В сле­дую­щем разд­ е­ле буд­ ет пок­ аз­ ан­ о, как ис­ поль­зов­ ать + и - с шабл­ о­на­ми по­ис­ка. Но­мер 0 от­ве­чае­ т са­мом­ у на­ча­лу фай­ла (воо­ бр­ а­жаем­ ая нул­ е­вая стро­ка) и эк­вив­ а­лент­ ен 1-. Оба эле­мен­та поз­ вол­ я­ют коп­ и­ров­ ать или пер­ е­ме­щать текст в  на­чал­ о файл­ а, то есть пер­ ед перв­ ой строк­ ой, отк­ ры­вающ­ ей текст. Нап­ ри­мер: :-,+t0 Коп­ ир­ о­ва­ние трех строк (от строк­ и вы­ше курс­ ор­ а до строк­ и ниж­ е нег­ о) и их вставк­ а в нач­ ал­ о фай­ла.Шаблоны поиска ex мо­жет обр­ ащ­ атьс­ я к стро­кам пос­ ред­ств­ ом шабл­ он­ ов по­ис­ка. Нап­ ри­ мер: :/pattern/d Уда­лить сле­дующ­ ую най­ден­ную строк­ у, со­держ­ а­щую шабл­ он pat­tern. :/pattern/+d Уда­лить строк­ у, рас­по­ло­жен­ную ниж­ е той, кот­ ор­ ая сод­ ерж­ ит pattern. (Вме­сто + можн­ о на­пи­сать +1.) :/pattern1/,/pattern2/d Уда­лить от пер­вой стро­ки, сод­ ерж­ а­щей pattern1, до перв­ ой строк­ и, со­держ­ а­щей pattern2.1 При исп­ оль­зо­ван­ ии отн­ о­сит­ ель­ных ад­ре­сов не нужн­ о от­де­лять плюс и ми­ нус от след­ ующ­ их за ни­ми чис­ ел. Нап­ ри­мер, +10 знач­ ит «10 след­ ующ­ их строк», а + 10 озн­ а­ча­ет «11 сле­дующ­ их строк (1+10)», то есть не со­всем то, что вам нужн­ о.

82 Глава 5. Введение в редактор ex:.,/pattern/m23 Взять текст от тек­ у­щей строк­ и (.) до пер­вой, сод­ ер­жащ­ ей pattern, и пер­ е­мес­тить его по­сле строк­ и 23.Об­рат­ и­те вним­ а­ние, что шабл­ он огр­ ан­ и­чен ко­сы­ми черт­ ам­ и слев­ а и спра­ва.Ес­ли вы уда­ляе­те текст с  ис­польз­ о­ван­ и­ем шаб­ло­нов и  в  vi, и  в  ex, тознай­те, что в  ра­бо­те этих двух ре­дак­то­ров есть от­лич­ ия1. Пусть файлpractice со­дер­жит сле­дующ­ ие стро­ки:With a screen editor you can scroll thepage, move the cursor, delete lines, insertcharacters and more, while seeing resultsof your edits as you make them.Кла­виш­ и Ре­зуль­татd/while With a screen editor you can scroll the page, move the cursor, while seeing results of your edits as you make them.:.,/while/d В vi ком­ анд­ а уда­лен­ ия до pattern сти­рае­ т текст от курс­ ор­ а до сло­ ва while, но не трог­ ае­ т ос­тат­ки обеи­ х строк. With a screen editor you can scroll the of your edits as you make them. Ко­манд­ а ex удал­ я­ет весь диап­ аз­ он, зад­ анн­ ый этим­ и стро­ка­ми. В на­шем слу­чае это те­ку­щая стро­ка и стро­ка, сод­ ер­жа­щая шаб­лон.Переопределение текущего положения курсора Иног­ да ис­польз­ ов­ а­ние от­но­сит­ ель­но­го адр­ ес­ а в ком­ ан­де мо­жет при­вес­ ти к  не­пред­ска­зуем­ ым ре­зуль­тат­ ам. Предп­ ол­ о­жим, что кур­сор нах­ о­ дитс­ я на стро­ке 1 и вы хот­ и­те выв­ ест­ и стро­ку 100 и еще пять строк ни­ же нее. Ес­ли наб­ рать: :100,+5 p то по­явит­ся соо­ бщ­ е­ние об ошиб­ке «First address exceeds second» (пер­ вый адр­ ес прев­ ыш­ ае­ т втор­ ой). Прич­ ин­ а неу­ дач­ и в том, что вто­рой ад­рес выч­ исл­ яе­ тс­ я по отн­ ош­ ен­ ию к тек­ ущ­ ей поз­ иц­ ии курс­ о­ра (стро­ка 1), так что на сам­ ом дел­ е ваш­ а ко­ман­да экв­ ив­ а­лентн­ а сле­дую­щей: :100,6 p Нуж­но ка­ким-то об­ра­зом сде­лать так, чтоб­ ы ком­ ан­да счит­ ал­ а стро­ку 100 тек­ у­щей, не­смот­ря на то, что кур­сор стои­ т на перв­ ой строк­ е. 1 ex – стро­ко­вый ре­дакт­ ор, и поэ­ то­му опер­ и­ру­ет строк­ а­ми как це­лым, тог­ да как vi мо­жет обр­ а­ба­тыв­ ать часть стро­ки. – Прим. на­уч. ред.

Редактирование в ex 83 В ex есть так­ ая воз­мож­ность. Ес­ли вы ис­поль­зует­ е точк­ у с зап­ я­той вме­ сто за­пят­ ой, то тек­ ущ­ им бу­дет счит­ атьс­ я ад­рес пер­вой строк­ и. На­при­ мер, ком­ ан­да: :100;+5 p выв­ е­дет тре­буе­мые строк­ и. Те­перь +5 выч­ ис­ля­етс­ я по от­нош­ ен­ ию к стро­ ке 100. Точ­ка с зап­ я­той пол­ ез­на при ис­польз­ о­ван­ ии как шаб­лон­ ов пои­ с­ ка, так и аб­со­лютн­ ых ад­рес­ ов. На­при­мер, чтоб­ ы вы­вес­ти строк­ у, сод­ ер­ жа­щую pattern, а такж­ е 10 сле­дующ­ их строк, введ­ и­те ком­ ан­ду: :/pattern/;+10 pГлобальный поиск Вы уже знает­ е, как в vi исп­ ольз­ о­вать / (кос­ ую чер­ту) для пои­ ск­ а в фай­ ле по шаб­ло­ну. В ex есть ко­ман­да гло­баль­ног­ о по­иск­ а g (от global), поз­ во­ ляю­щая иск­ ать по шаб­лон­ у и  вы­во­дить все стро­ки с  этим шаб­ло­ном. Ко­ман­да :g! име­ет про­тив­ о­пол­ ож­ное дейс­ тв­ ие: она (или ее си­но­ним :v) ищет стро­ки, не сод­ ерж­ а­щие шаб­ло­ны. Ко­ман­ду глоб­ альн­ о­го пои­ ск­ а мож­но ис­поль­зов­ ать для всех строк в фай­ ле либ­ о ука­зы­вать диап­ аз­ он строк, ог­ран­ ич­ и­вающ­ их при­мен­ е­ние ко­ ман­ды гло­бальн­ о­го по­иск­ а. :g/pattern На­хо­дит (пер­ ех­ о­дит на) по­следн­ ее вхо­жд­ е­ние pattern в фай­ле. :g/pattern/p На­ход­ ит и выв­ од­ ит все строк­ и в фай­ле, со­дер­жащ­ ие pattern. :g!/pattern/nu Нах­ о­дит и вы­вод­ ит все стро­ки фай­ла (и их но­ме­ра), кот­ ор­ ые не со­ дер­жат pattern. :60,124g/pattern/p Нах­ од­ ит и вы­вод­ ит все стро­ки с но­ме­ра­ми, леж­ а­щим­ и в диа­па­зон­ е от 60 до 124, сод­ ер­жа­щие pattern. Как можн­ о дог­ а­датьс­ я из наз­ ван­ ия, g мож­ ет так­же исп­ ольз­ о­ватьс­ я для гло­баль­ной за­мен­ ы. Об этом мы по­го­во­рим в гла­ве 6.Сочетания команд ex Что­бы вып­ олн­ ить нов­ ую ко­манд­ у ex, необяз­ ат­ ель­но кажд­ ый раз вво­ дить двое­точ­ ие. Верт­ ик­ аль­ная чер­та (|) слу­жит разд­ е­ли­тел­ ем ко­манд в  ex, что поз­ вол­ яе­ т ком­бин­ ир­ о­вать нес­ кольк­ о ко­манд в  од­ном при­гла­ ше­нии ex (при­мер­но так же, как точк­ а с за­пят­ ой раз­де­ля­ет нес­ кольк­ о ко­манд в одн­ ом приг­ ла­ше­нии ко­мандн­ ой строк­ и обол­ очк­ и UNIX). При ис­поль­зов­ а­нии | нужн­ о сле­дить за ука­зы­вае­мым­ и адр­ ес­ ам­ и строк. Ес­ ли одн­ а из ком­ анд мен­ яе­ т по­ряд­ ок строк в фай­ле, то сле­дующ­ ая бу­дет ра­бо­тать уже с но­вым расп­ о­ло­же­ни­ем строк. На­при­мер:

84 Глава 5. Введение в редактор ex :1,3d | s/thier/their/ Удал­ я­ет стро­ки с 1-й по 3-ю (по­сле этог­ о вы оказ­ ы­вае­тесь на верх­ней строк­ е фай­ла), а за­тем про­изв­ од­ ит зам­ ен­ у в те­ку­щей стро­ке (ко­то­рая име­ла но­мер 4 пер­ ед вы­зо­вом ком­ анд­ ы ex). :1,5 m 10 | g/pattern/nu Пер­ ем­ е­ща­ет строк­ и с 1-й по 5-ю на по­зиц­ ию по­сле строк­ и 10, а зат­ ем отоб­ ра­жае­ т все стро­ки (с ном­ ер­ ам­ и), со­дер­жа­щие pattern. Об­ра­ти­те вним­ ан­ ие, что здесь исп­ оль­зу­ютс­ я проб­ е­лы, что­бы об­легч­ ить чте­ние ком­ анд.Сохранение и выход Вы уже знает­ е ком­ ан­ду vi ZZ, с помощью ко­то­рой осуществляется вы­ хо­д из прог­ рамм­ ы с со­хра­нением (записью) файла. Од­нак­ о част­ о оказ­ ы­ ва­етс­ я удоб­нее вых­ о­дить из фай­ла с по­мо­щью ком­ анд ex, так как они обесп­ е­чив­ а­ют боль­ший конт­ роль. По ход­ у из­лож­ е­ния мы уже упо­мин­ а­ ли нек­ от­ ор­ ые из них. Теп­ ерь пред­прим­ ем бол­ ее фор­маль­ный подх­ од: :w Зап­ ис­ ы­вае­ т (со­хран­ яе­ т) буф­ ер в файл, но не вых­ од­ ит из про­грамм­ ы. Вы мо­жет­ е (и долж­ны) исп­ оль­зо­вать :w во врем­ я се­ан­са ред­ акт­ ир­ о­ва­ ния, что­бы за­щи­тить прав­ки от сист­ емн­ ых сбое­ в и серье­ з­ных оши­ бок при ре­дак­ти­ро­ва­нии. :q Вы­хо­дит из ре­дак­то­ра (и  воз­вращ­ ае­ т в  приг­ ла­ше­ние ком­ андн­ ой стро­ки UNIX). :wq Выполняет два дей­ст­вия: за­пи­сыв­ ае­ т файл и вы­ход­ ит из ред­ ак­тор­ а. Про­из­вод­ итс­ я без­усл­ ов­ная зап­ ись, да­же есл­ и файл не был изм­ ен­ ен. :x Зап­ и­сы­вае­ т файл и вы­ход­ ит из ред­ ак­тор­ а. Файл за­пис­ ы­вае­ тс­ я толь­ ко в том слу­чае, есл­ и в нем прои­ зошл­ и изм­ ен­ ен­ ия1. vi за­щищ­ ае­ т и  су­ще­ст­вую­щие файл­ ы, и  сдел­ анн­ ые прав­ки в  буф­ е­ре. На­при­мер, при по­пытк­ е за­пис­ ать сод­ ер­жим­ ое бу­фер­ а в сущ­ е­ст­вующ­ ий файл vi вы­даст пред­ уп­ реж­ ­ден­ ие. Анал­ о­гич­но, есл­ и вы вы­зва­ли vi с фай­лом, сдел­ ал­ и изм­ е­не­ния и хот­ и­те вый­ти без сох­ ра­нен­ ия, ред­ ак­тор выд­ аст соо­ б­ще­ние об ошибк­ е прим­ ерн­ о след­ ующ­ е­го вид­ а: No write since last change. (пос­ ледн­ ие изм­ ен­ е­ния не за­пис­ ан­ ы) 1 Раз­ли­чие в :wq и :x важ­но при ред­ ак­тир­ о­ван­ ии ис­ходн­ ог­ о код­ а и исп­ оль­зо­ ва­нии make, дей­ств­ ия кот­ ор­ о­го за­ви­сят от вре­ме­ни из­мен­ е­ния файл­ ов.

Сохранение и выход 85 Эти пред­ уп­ реж­ д­ е­ния мо­гут пред­ от­врат­ ить су­щес­ т­вен­ные ошибк­ и, но ино­гда вам дей­ств­ ит­ ель­но нужн­ о вып­ олн­ ить так­ ую ком­ ан­ду. Воск­ ли­ цат­ ель­ный знак (!) по­сле ко­ман­ды от­ме­ня­ет все пред­ у­преж­ д­ е­ния: :w! :q! :w! так­же мож­но исп­ оль­зо­вать для сох­ ран­ ен­ ия фай­ла, отк­ ры­то­го в ре­ жим­ е «тольк­ о для чтен­ ия» ко­ман­дам­ и vi -R или view (пред­пол­ аг­ ае­ т­ся, что у поль­зо­ва­те­ля есть пра­во на за­пись фай­ла в фай­ло­вой сист­ ем­ е). :q! – это сам­ ая важ­ная ко­ман­да ре­дакт­ и­ров­ ан­ ия, поз­ вол­ яющ­ ая вы­хо­ дить из про­грамм­ ы, не за­тра­ги­вая перв­ о­на­чаль­ный файл не­зав­ и­сим­ о от изм­ е­нен­ ий, сдел­ анн­ ых во вре­мя сеа­ нс­ а. Сод­ ерж­ им­ ое буф­ е­ра при этом бу­дет по­тер­ я­но.Переименование буфера Ком­ анд­ а :w мож­ ет такж­ е исп­ оль­зо­вать­ся для со­хран­ е­ния все­го буф­ ер­ а (или ко­пии ре­дак­тир­ уе­мо­го вам­ и файл­ а) под друг­ им име­нем. Пусть есть файл practice, со­дер­жащ­ ий 600 строк. Вы от­кры­вае­те файл, дел­ ает­ е мно­жес­ тв­ о прав­ ок, зат­ ем хот­ и­те выйт­ и, но при этом сох­ ран­ ить как ста­рую верс­ ию practice, так и ис­правл­ ен­ную, чтоб­ ы их мож­но был­ о срав­нив­ ать. Чтоб­ ы сох­ ра­нить от­ред­ ак­тир­ ов­ анн­ ый бу­фер в  фай­ле под наз­ ва­ние­ м practice.new, вып­ ол­ни­те ко­манд­ у: :w practice.new Ста­рая верс­ ия, расп­ о­лож­ ен­ная в  фай­ле practice, ост­ ае­ тс­ я не­изм­ енн­ ой (ес­ли толь­ко вы не вып­ ол­ня­ли :w). Те­перь ко­манд­ ой :q можн­ о выйт­ и из ре­дакт­ и­ро­ва­ния но­вой верс­ ии.Сохранение фрагмента файла При ре­дак­ти­ро­ван­ ии фай­ла част­ о мо­жет по­на­доб­ ить­ся сох­ ра­нить его часть в  от­дельн­ ом фай­ле. К  прим­ ер­ у, так можн­ о пос­ туп­ ать с  ко­дам­ и форм­ а­ти­ро­ва­ния и  текс­ том, кот­ ор­ ые буд­ ут ис­поль­зов­ атьс­ я в  дру­гих фай­лах в ка­че­ст­ве за­го­ловк­ ов. Для сох­ ран­ ен­ ия част­ и фай­ла мож­но ис­польз­ о­вать ком­би­на­цию ко­ман­ ды адр­ е­сац­ ии строк с ком­ анд­ ой зап­ и­си w. На­при­мер, ес­ли вы на­хо­ди­ тесь в фай­ле practice и хот­ ит­ е сох­ ра­нить его часть под име­нем newfile, мож­но ввес­ ти: :230,$w newfile Со­хра­ня­ет от 230-й стро­ки до конц­ а файл­ а в файл newfile. :.,600w newfile Сох­ ра­няе­ т строк­ и с те­кущ­ ей до 600-й в newfile.

86 Глава 5. Введение в редактор exДобавление к сохраненному файлу Вме­сте с  ком­ ан­дой w мож­но ис­польз­ ов­ ать опер­ а­цию пе­рен­ ап­ рав­ле­ния UNIX с до­бав­ле­ни­ем (>>). То­гда вы доб­ а­ви­те все со­держ­ и­мое бу­фе­ра или его часть к су­ще­ств­ ую­ще­му файл­ у. Нап­ рим­ ер, ес­ли ввес­ ти: :1,10w newfile а за­тем :340,$w >>newfile то newfile буд­ ет со­дер­жать стро­ки с 1 по 10, а такж­ е со строк­ и 340 до конц­ а бу­фе­ра.Копирование одного файла в другой Ино­гда прих­ о­дитс­ я коп­ и­ро­вать уже имею­щиес­ я в  сис­те­ме текст или данн­ ые в ред­ акт­ ир­ уе­мый файл. В vi мож­но счи­тать сод­ ерж­ им­ ое друг­ о­ го фай­ла с по­мо­щью ком­ анд­ ы ex: :read filename или ее аб­брев­ иат­ у­рой: :r filename Эта ко­манд­ а встав­ляе­ т сод­ ерж­ им­ ое filename, нач­ ин­ ая со строк­ и пос­ ле по­лож­ ен­ ия курс­ ор­ а в фай­ле. Есл­ и нужн­ о указ­ ать стро­ку, отл­ ичн­ ую от той, где на­ход­ итс­ я кур­сор, про­сто введ­ и­те ее но­мер (или лю­бой дру­гой ад­рес стро­ки) пер­ ед ком­ анд­ ой read или r. Предп­ о­ло­жим, вы ред­ акт­ ир­ уе­те файл practice и  хот­ и­те счит­ ать файл под наз­ ван­ ие­ м data из дру­гог­ о ка­та­ло­га, нап­ ри­мер /home/tim. Пе­рем­ ес­ тит­ е курс­ ор на одн­ у строк­ у вы­ше той, ку­да вы хот­ ит­ е встав­ ить нов­ ые данн­ ые, и вве­ди­те: :r /home/tim/data Все сод­ ерж­ и­мое файл­ а /home/tim/data буд­ ет счит­ ан­ о в practice, нач­ ин­ ая со строк­ и ниж­ е кур­сор­ а. Чтоб­ ы счи­тать тот же файл и по­мест­ ить его пос­ ле стро­ки 185, введ­ ит­ е: :185r /home/tim/data Есть и дру­гие спо­соб­ ы счит­ ать файл: :$r /home/tim/data По­ме­ща­ет счит­ ы­вае­мый файл в кон­ ец те­ку­щег­ о. :0r /home/tim/data Пом­ ещ­ а­ет счит­ ы­вае­мый файл в са­мое на­ча­ло тек­ ущ­ ег­ о. :/pattern/r /home/tim/data По­ме­ща­ет счи­ты­ваем­ ый файл в тек­ ущ­ ий пос­ ле стро­ки, со­держ­ ащ­ ей pattern.

Редактирование нескольких файлов 87Редактирование нескольких файловКо­ман­ды ex поз­ во­ля­ют пе­рек­ лю­чать­ся меж­ду нес­ коль­ким­ и фай­ла­ми.Преи­ мущ­ ес­ тв­ ом ред­ акт­ ир­ ов­ а­ния сраз­ у не­сколь­ких фай­лов являетсяско­рость. При ис­польз­ о­ва­нии сис­тем­ ы со­вмес­ тн­ о с дру­ги­ми польз­ о­ва­те­лям­ и вых­ од из vi и его по­вторн­ ый зап­ уск для сле­дую­щег­ о фай­ла зай­мут оп­ред­ ел­ ен­ное вре­мя. Ко­гда вы ос­тае­тесь внут­ри од­ног­ о сеа­ нс­ а ре­дак­тир­ о­ван­ ия, вы выи­ гр­ ы­вает­ е не толь­ко в  скор­ о­сти пе­рек­ люч­ ен­ иямеж­ду файл­ а­ми. Так­ им обр­ а­зом вы сох­ ран­ и­те ра­нее оп­ред­ е­лен­ные со­кращ­ е­ния и пос­ лед­ ов­ ат­ ельн­ ос­ ти ком­ анд (см. глав­ у 7), а бу­фер­ ы коп­ и­ро­ва­ния (yank) поз­ вол­ ят ко­пи­ров­ ать текст из од­но­го фай­ла в дру­гой.Вызов vi с несколькими файламиПри перв­ ом за­пуск­ е vi можн­ о указ­ ы­вать бо­лее од­но­го фай­ла для ред­ ак­тир­ ов­ ан­ ия, а впос­ лед­ст­вии поль­зо­ватьс­ я ко­ман­да­ми ex для пе­рек­ люч­ е­ния меж­ду ним­ и. На­при­мер: $ vi file1 file2Внач­ ал­ е буд­ ет ред­ акт­ и­ро­ватьс­ я file1. По­сле оконч­ а­ния ред­ акт­ ир­ ов­ а­ния пер­во­го файл­ а ком­ анд­ ой ex :w зап­ иш­ ит­ е (со­хра­ни­те) file1, а ком­ ан­дой :n вы­зов­ ит­ е след­ ующ­ ий файл (file2).Пусть нуж­но отр­ е­дакт­ ир­ о­вать два фай­ла: practice и note.Кла­виш­ и Ре­зульт­ атvi practice note With a screen editor you can scroll the page, move the cursor, delete lines, insert characters, and more, while seeing От­кры­ва­ют­ся два фай­ла, practice и note. Снач­ ал­ а на эк­ран­ е по­явит­ся указ­ ан­ный пер­вым файл practice. Внес­ и­те ка­кие- ли­бо из­мен­ е­ния.:w \"practice\" 6 lines, 328 characters Со­хран­ ит­ е отр­ е­дак­тир­ о­ван­ный файл practice ком­ ан­дой ex :w и наж­ ми­те ENTER.:n Dear Mr. Henshaw: Thank you for the prompt . . . Ком­ анд­ ой ex :n вы­зов­ и­те след­ ующ­ ий файл note, наж­ ми­те ENTER и сде­лай­те ис­прав­ле­ния.:x \"note\" 23 lines, 1343 characters Со­хра­не­ние втор­ ог­ о фай­ла note и вых­ од из сеа­ н­са ре­дакт­ и­ ро­ва­ния.

88 Глава 5. Введение в редактор exИспользование списка аргументовex поз­ вол­ яе­ т вып­ ол­нять го­разд­ о больш­ е дейс­ тв­ ий, неж­ е­ли про­стое пе­ре­ключ­ ен­ ие на след­ ую­щий файл ком­ анд­ ой :n. Ком­ анд­ а :args (сок­ ращ­ а­етс­ я до :ar) пе­ре­чис­ля­ет все файл­ ы, при­сутс­ т­вов­ авш­ ие в  ком­ андн­ ойстро­ке, при этом те­ку­щий файл зак­ люч­ ае­ тс­ я в скобк­ и.Клав­ и­ши Рез­ ульт­ атvi practice note With a screen editor you can scroll the page, move the cursor, delete lines, insert characters, and more, while seeing:args Отк­ рыв­ аю­ тс­ я два файл­ а, practice и note. Сна­ча­ла на эк­ран­ е по­явит­ся ука­зан­ный пер­вым файл practice. Внес­ ит­ е ка­кие- либ­ о изм­ ен­ ен­ ия. [practice] note vi отоб­ раз­ ит ар­гум­ ент­ ы в стро­ке сос­ тоян­ ия (имя те­ку­щег­ о фай­ла зак­ лю­чен­ о в скобк­ и).Ком­ анд­ а :rewind (:rew) де­лае­ т тек­ ущ­ им пер­вый файл в  спи­ске фай­лов,ука­зан­ных в ко­мандн­ ой стро­ке. В elvis и Vim есть соо­ т­вет­ст­вующ­ ая ко­ман­да :last, кот­ ор­ ая пер­ ек­ люч­ ае­ тс­ я на по­следн­ ий файл в этом спи­ске.Вызов новых файловНеобя­за­тельн­ о выз­ ы­вать не­сколь­ко файл­ ов в на­ча­ле се­анс­ а ред­ ак­тир­ о­ва­ния. Ком­ ан­дой :e мож­но пер­ е­клю­читьс­ я на нов­ ый файл в лю­бой мо­мент. Есл­ и вы хот­ и­те отр­ ед­ ак­тир­ о­вать в vi дру­гой файл, сох­ ран­ и­те сна­ча­ла тек­ ущ­ ий (:w), а за­тем на­бер­ ит­ е ко­ман­ду::e filenameДоп­ ус­тим, вы ра­бо­тае­те с  файл­ ом practice и  реш­ ил­ и ред­ ак­ти­ров­ атьфайл letter, а пот­ ом сно­ва вер­нуть­ся к practice:Кла­виш­ и Ре­зульт­ ат:w \"practice\" 6 lines, 328 characters:e letter Сох­ ран­ и­те practice ко­манд­ ой w и наж­ ми­те ENTER. practice со­ хран­ ен и ост­ ае­ т­ся на эк­ран­ е. Сейч­ ас мож­но пер­ е­ключ­ итьс­ я на друг­ ой файл, пос­ коль­ку ваш­ и прав­ки со­хра­нен­ ы. \"letter\" 23 lines, 1344 characters Вы­зов­ ит­ е ко­ман­дой e файл letter и на­жми­те ENTER. Прод­ ел­ ай­ те ка­кие-либ­ о из­мен­ е­ния.

Редактирование нескольких файлов 89 vi «пом­нит» два имен­ и файл­ а как те­ку­щее и  альт­ ер­нат­ ив­ное. К  ним можн­ о об­ращ­ ать­ся с по­мощ­ ью сим­вол­ ов % (имя тек­ у­ще­го файл­ а) и # (аль­ терн­ ат­ ив­ное). # удоб­но ис­поль­зо­вать с ко­ман­дой :e, так как она по­зво­ля­ ет лег­ко пер­ ек­ люч­ ать­ся впер­ ед и наз­ ад по этим двум файл­ ам. В тольк­ о что прив­ ед­ ен­ном прим­ ер­ е ком­ ан­дой :e # можн­ о верн­ уть­ся к  пер­во­му файл­ у (practice). Сод­ ер­жи­мое фай­ла practice мож­но счит­ ать в тек­ ущ­ ий файл, есл­ и выз­ вать :r #. Есл­ и тек­ у­щий файл не был сох­ ран­ ен, то vi не поз­ во­лит пе­рем­ ещ­ ать­ся меж­ду фай­ла­ми пос­ редс­ тв­ ом ком­ анд :e или :n, по­ка вы не скаж­ е­те ему сде­лать это прин­ у­ди­тель­но, до­бав­ ив воск­ лиц­ ат­ ель­ный знак пос­ ле ко­ манд­ ы. Нап­ ри­мер, ес­ли по­сле изм­ е­нен­ ий в  letter нужн­ о от­каз­ ать­ся от них и верн­ утьс­ я к practice, на­бе­ри­те :e! #. След­ ующ­ ая ком­ ан­да тож­ е пол­ езн­ а. Она от­мен­ я­ет правк­ и и воз­вра­щае­ т поль­зо­ват­ е­ля к по­следн­ ей сох­ ран­ енн­ ой вер­сии тек­ у­щег­ о фай­ла: :e! В от­лич­ ие от сим­во­ла #, % пол­ е­зен толь­ко при за­пис­ и со­держ­ им­ о­го те­ку­ щег­ о буф­ ер­ а в но­вый файл. Нап­ ри­мер, в не­давн­ ем разд­ ел­ е «Пер­ е­име­но­ ван­ ие буф­ ер­ а» на стр. 85 мы пок­ аз­ а­ли, как со­хран­ ить до­полн­ и­тельн­ ую верс­ ию фай­ла practice при по­мощ­ и ко­ман­ды: :w practice.new Так как име­ни тек­ у­ще­го фай­ла со­от­вет­ст­ву­ет %, эту же строк­ у можн­ о ввес­ ти так: :w %.newПереключение между файлами из редактора vi По­сколь­ку вам, ско­рее все­го, прид­ етс­ я час­то пе­ре­ключ­ атьс­ я на пред­ ы­ ду­щий файл, необяз­ а­тель­но для это­го об­ращ­ атьс­ я к ко­мандн­ ой стро­ке ex. Ко­манд­ а vi ^^ (кла­ви­ши Ctrl и кар­ етк­ а) сдел­ а­ет это за вас. Вы­зов этой ком­ ан­ды эк­ви­вал­ ен­тен ввод­ у :e #. Как и в случ­ ае ком­ анд­ ы :e, есл­ и те­ку­ щий буф­ ер не со­хра­нен, vi не поз­ вол­ ит пер­ ейт­ и к пре­ды­дущ­ е­му файл­ у.Правки между файлами Ес­ли прис­ во­ить бу­фе­ру коп­ и­ров­ ан­ ия (yank) одн­ о­бук­ в­ ен­ное имя, то по­ явитс­ я удоб­ный спо­соб пе­ре­ме­ще­ния текс­ та из одн­ о­го файл­ а в друг­ ой. При за­груз­ке но­вог­ о фай­ла в буф­ ер vi ком­ ан­дой :e сод­ ер­жим­ ое име­но­ ван­ных бу­фе­ров не очищ­ а­етс­ я. Так­ им об­ра­зом, скоп­ ир­ о­вав или удал­ ив текст из одн­ о­го фай­ла (при не­об­ход­ им­ ос­ ти его мож­но по­мес­тить в  не­ сколь­ко имен­ о­ван­ных буф­ ер­ ов), вы­звав нов­ ый файл ком­ анд­ ой :e и вста­ вив име­нов­ анн­ ые буф­ е­ры в нов­ ый файл, вы смо­жет­ е пе­рен­ о­сить фраг­ мент­ ы текс­ та межд­ у файл­ ам­ и.

90 Глава 5. Введение в редактор exСлед­ ую­щий прим­ ер илл­ юс­ тр­ ир­ уе­ т, как пе­рен­ ес­ ти текст из одн­ ог­ о фай­ла в дру­гой.Кла­виш­ и Рез­ уль­тат\"f4yy With a screen editor you can scroll the page, move the cursor, delete lines, insert characters, and more, while seeing the results of the edits as you make them Ско­пи­руй­те чет­ ы­ре стро­ки в буф­ ер f.:w \"practice\" 6 lines, 238 characters:e letter Со­хран­ ит­ е файл. Dear Mr. Henshaw: I thought that you would be interested to know that: Yours truly, Зай­дит­ е в файл letter ко­манд­ ой :e и пер­ ем­ ес­тит­ е курс­ ор ту­да, где дол­жен бу­дет рас­по­лаг­ ать­ся ско­пир­ ов­ анн­ ый текст.\"fp Dear Mr. Henshaw: I thought that you would be interested to know that: With a screen editor you can scroll the page, move the cursor, delete lines, insert characters, and more, while seeing the results of the edits as you make them Yours truly, Вставьт­ е скоп­ ир­ о­ванн­ ый текст из име­нов­ анн­ о­го буф­ ер­ а f ни­же кур­со­ра.Дру­гой спо­соб пе­ре­ме­ще­ния текс­ та меж­ду файлами со­стои­ т в исп­ оль­зо­ван­ ии ком­ анд ex :ya (от yank) и :pu (от put). Они раб­ о­таю­ т при­мерн­ о также, как их vi-эк­вив­ ал­ ент­ ы y и p, но ис­поль­зую­ тс­ я с име­нов­ ан­ным­ и бу­фер­ ам­ и и адр­ е­са­цие­ й строк, при­нят­ ой в ex.На­при­мер, ко­ман­да: :160,224ya aско­пир­ уе­ т стро­ки со 160-й по 224-ю в буф­ ер a. Пос­ ле это­го ком­ анд­ ой :eнуж­но пер­ ейт­ и к файл­ у, ку­да вы хо­ти­те встав­ ить эти строк­ и, по­мест­ итькур­сор на стро­ку, где нео­ б­хо­ди­мо вста­вить скоп­ ир­ ов­ анн­ ые стро­ки, а за­тем ввес­ ти: :pu aчто­бы вста­вить сод­ ерж­ и­мое бу­фер­ а a пос­ ле тек­ у­щей строк­ и.

6 Глобальная замена Глава 6.Иног­ да в  на­по­ло­ви­ну го­тов­ ом до­ку­мент­ е или за­кон­чен­ном чер­но­ви­кемо­гут обн­ ар­ у­житьс­ я нет­ очн­ о­сти. На­при­мер, в рук­ ов­ о­дстве по эксп­ луа­тац­ ии мож­ ет изм­ е­нитьс­ я на­зван­ ие тов­ а­ра, прис­ утс­ тв­ ующ­ ее во всемфай­ле (ох уж этот мар­ке­тинг!). Дос­та­точ­но час­то нужн­ о верн­ утьс­ я и что-ниб­ удь ис­прав­ ить, по­сле че­го сде­лать анал­ ог­ ичн­ ые из­ме­не­ния в  не­скольк­ их мест­ ах.Гло­бальн­ ая замена – мощн­ ый инс­ тр­ у­мент для под­ об­ных пра­вок. Ис­польз­ уя толь­ко одн­ у ко­ман­ду, вы смо­жет­ е авт­ ом­ а­тич­ ес­ ки за­мен­ ять сло­во (или строк­ у симв­ о­лов) в люб­ ом мес­те фай­ла.Во врем­ я глоб­ альн­ ой зам­ ен­ ы ре­дакт­ ор ex пров­ е­ря­ет каж­дую стро­куфай­ла на на­лич­ ие зад­ анн­ ог­ о шаб­лон­ а симв­ о­лов. Во всех строк­ ах, гдета­кой шабл­ он об­нар­ уж­ ен, ex зам­ е­ня­ет его на нов­ ую стро­ку сим­вол­ ов.Сна­чал­ а в ка­че­ст­ве шаб­лон­ а по­ис­ка мы буд­ ем рас­сматр­ и­вать прос­ туюстро­ку, а да­лее в этой гла­ве изу­чим мощ­ный язык по­ис­ка по шаб­лон­ у,изв­ естн­ ый как рег­ у­лярн­ ые вы­раж­ ен­ ия.При гло­бальн­ ой зам­ ен­ е ex исп­ оль­зу­ет тольк­ о две ко­ман­ды: :g (global)и  :s (substitute). По­скольк­ у их синт­ ак­сис мо­жет быть дов­ ольн­ о слож­ным, мы нач­нем рас­сматр­ ив­ ать его по­этап­но.Ком­ анд­ а за­мен­ ы имее­ т след­ ующ­ ий вид: :s/old/new/При этом в тек­ ущ­ ей стро­ке перв­ ое вхож­ д­ е­ние шабл­ он­ а old зам­ ен­ ит­ся наnew. Знак / (кос­ ая чер­та) служ­ ит раз­дел­ ит­ е­лем меж­ду раз­ным­ и час­тя­ми ком­ анд­ ы (ко­гда кос­ ая чер­та явл­ я­етс­ я пос­ лед­ним симв­ ол­ ом в стро­ке,ее можн­ о не став­ ить).Ко­манд­ а зам­ ен­ ы с син­такс­ ис­ ом: :s/old/new/g

92 Глава 6. Глобальная замена мен­ я­ет в тек­ у­щей строк­ е каж­дое вхож­ д­ ен­ ие old на new. Ком­ ан­да :s до­ пуск­ а­ет нал­ ич­ ие опц­ ий по­сле стро­ки за­ме­ны. Опц­ ия g в прив­ ед­ енн­ ом при­мер­ е озн­ а­ча­ет глоб­ альн­ ость. (Оп­ция g от­но­сит­ся ко всем вхож­ д­ ен­ и­ ям шабл­ он­ а в строк­ е; не пу­тай­те ее с ком­ анд­ ой :g, зат­ ра­ги­ваю­щей каж­ дую стро­ку фай­ла.) Есл­ и пер­ ед ко­ман­дой :s прип­ и­сать адр­ е­са, то диа­паз­ он ее дейс­ т­вия рас­ ши­рит­ся на не­сколь­ко строк. Нап­ рим­ ер, след­ ую­щая ко­манд­ а бу­дет ме­ нять каж­дое вхож­ д­ ен­ ие old на new в стро­ках с 50-й по 100-ю: :50,100s/old/new/g а эта пом­ ен­ яе­ т каж­дое вхож­ ­ден­ ие old на new во всем файл­ е: :1,$s/old/new/g Чтоб­ ы за­дав­ ать дейс­ тв­ ие в кажд­ ой строк­ е фай­ла, мож­но вмес­ то 1,$ ука­ зы­вать %. Так, по­следн­ яя ком­ ан­да мож­ ет быть зап­ и­са­на след­ ующ­ им об­ ра­зом: :%s/old/new/g Глоб­ аль­ная зам­ е­на раб­ о­та­ет нам­ но­го бы­ст­рее пои­ с­ка и за­мен­ ы каж­до­го вхо­жд­ е­ния стро­ки. Пос­ коль­ку эта ком­ ан­да мо­жет ис­поль­зо­ватьс­ я для сам­ ых разн­ ых ис­правл­ е­ний и об­ла­да­ет больш­ им­ и воз­можн­ ос­ тя­ми, мы снач­ ал­ а про­илл­ ю­стр­ ир­ у­ем про­стые за­ме­ны, а зат­ ем дойд­ ем до слож­ных кон­тек­ст­но-за­ви­си­мых прав­ ок.Подтверждаем замены При ис­польз­ ов­ ан­ ии ком­ анд пои­ ск­ а и зам­ е­ны лишн­ яя ос­то­рожн­ ость не пом­ е­ша­ет, так как ино­гда пол­ уч­ а­ет­ся сов­ сем не то, что ожид­ ается. На­ при­мер, вво­дом u мож­но от­мен­ ить по­следн­ юю ко­манд­ у по­иск­ а и зам­ е­ ны. Од­нак­ о част­ о неж­ ел­ ат­ ель­ные изм­ е­нен­ ия об­нар­ уж­ ив­ а­ютс­ я, ко­гда уже позд­но их отм­ ен­ ять. Дру­гой спос­ об защ­ и­ты файла – сох­ ра­нить его ком­ анд­ ой :w пер­ ед гло­баль­ной за­мен­ ой. Так у вас по крайн­ ей ме­ре буд­ ет возм­ ожн­ ость выйт­ и из фай­ла без сох­ ра­нен­ ия и верн­ уть­ся к сох­ ран­ ен­но­ му вар­ иа­ нт­ у. Такж­ е це­ле­со­об­раз­но вос­поль­зов­ атьс­ я ком­ анд­ ой :e!, что­ бы счит­ ать пред­ ыд­ у­щую вер­сию бу­фе­ра. Ре­ко­менд­ уе­ тс­ я проя­ в­лять ост­ ор­ ож­ность и хор­ о­шо по­ним­ ать, что имен­ но нужн­ о изм­ е­нить в файл­ е. Ес­ли вы хот­ ит­ е уви­деть рез­ ульт­ ат пои­ ск­ а и подт­ вер­ждать каж­дую зам­ е­ну пер­ ед ее вы­полн­ ен­ и­ем, доб­ авьт­ е в ко­ нец ком­ ан­ды зам­ ен­ ы опц­ ию c (confirm): :1,30s/his/the/gc ex отоб­ раз­ ит всю строк­ у с ис­ко­мым текс­ том и пом­ ет­ ит его наб­ о­ром ка­ре­ ток (^^^^): copyists at his school ^^^

Замена, зависящая от контекста 93Чтоб­ ы вып­ олн­ ить эту зам­ е­ну, вве­дит­ е y (yes) и  наж­ мит­ е ENTER. Дляотм­ ен­ ы правк­ и про­сто на­жми­те ENTER. this can be used for invitations, signs, and menus. ^^^Со­че­та­ние ком­ анд vi n (пов­ тор по­следн­ ег­ о пои­ с­ка) и точк­ и (.) (пов­ то­ре­ние пос­ ледн­ ей ком­ ан­ды) так­же яв­ля­етс­ я чрезв­ ыч­ айн­ о важн­ ым и быс­ т­рым спо­соб­ ом пройт­ ись по файл­ у и сде­лать множ­ ес­ т­вен­ные за­мен­ ы, ес­ли вы не хот­ и­те прим­ ен­ ять их гло­баль­но. На­прим­ ер, есл­ и нужн­ о зам­ е­нить все which на that, то мож­но сдел­ ать вы­бо­роч­ную про­верк­ у кажд­ о­говхо­жд­ е­ния which и по­ме­нять тольк­ о не­пра­виль­ные из них:/which По­иск whichcwthat ESC Смен­ ить на thatn Пов­ тор­ ить пои­ скn Пов­ тор­ ить по­иск, про­пуст­ ить из­мен­ е­ние. По­втор­ ить изм­ е­не­ние (есл­ и возм­ ожн­ о) (и т. д.)Замена, зависящая от контекста Прос­ тей­шая глоб­ аль­ная зам­ е­на мен­ я­ет од­но слов­ о (или фраз­ у) на дру­ гое. Есл­ и был на­бран файл с пов­ тор­ яю­щим­ и­ся опеч­ ат­кам­ и (editer вме­ сто editor), то мож­но сде­лать глоб­ аль­ную за­мен­ у сле­дую­щим обр­ аз­ ом: :%s/editer/editor/g При этом editer буд­ ет за­мен­ ен на editor во всем тек­сте. Для глоб­ аль­ной за­ме­ны есть еще один, бол­ ее слож­ный синт­ акс­ ис. Он поз­ вол­ я­ет иск­ ать по одн­ о­му шаб­ло­ну, а  по­сле на­хо­ж­ден­ ия сод­ ер­жащ­ ей его строк­ и сде­ лать за­ме­ну по друг­ о­му шабл­ он­ у. Это мож­но расс­ матр­ и­вать как зам­ ен­ у, зав­ ис­ я­щую от кон­текс­ та. Син­такс­ ис име­ет сле­дующ­ ий вид: :g/pattern/s/old/new/g Пер­вая g предп­ ис­ ыв­ ае­ т ко­манд­ е об­раб­ о­тать все строк­ и в фай­ле. По pat­ tern ищутс­ я строк­ и, где долж­на быть про­из­вед­ е­на за­мен­ а, а в строк­ ах, сод­ ерж­ ащ­ их pattern, ex дол­жен за­ме­нить (s) стар­ ые симв­ о­лы (old) на нов­ ые (new). По­следн­ яя опц­ ия g указ­ ы­ва­ет, что эта зам­ е­на долж­на вы­ полн­ ять­ся глоб­ альн­ о в данн­ ой стро­ке. На­при­мер, при на­пис­ а­нии этой книг­ и мы исп­ ольз­ о­ва­ли XML-ди­рек­ти­ вы <keycap> и </keycap> для об­рамл­ е­ния соч­ ет­ ан­ ия ESC, обоз­ нач­ ающ­ ег­ о клав­ иш­ у Escape. До­пус­тим, вы хо­ти­те пи­сать ESC про­пис­ны­ми бу­кв­ а­ ми, но не жел­ ае­те мен­ ять друг­ ие Escape, встре­чающ­ иес­ я в тек­сте. Что­ бы из­мен­ ить Esc на ESC толь­ко в стро­ке с дир­ ек­тив­ ой <keycap>, ис­поль­ зуй­те след­ ую­щее выр­ а­жен­ ие:

94 Глава 6. Глобальная замена :g/<keycap>/s/Esc/ESC/g Ес­ли вам нуж­но не толь­ко най­ти стро­ку по шаб­ло­ну, но и пом­ ен­ ять ее, не обя­зат­ ельн­ о наб­ и­рать этот шабл­ он два­ж­ды. Так, ком­ анд­ а: :g/string/s//new/g вы­пол­нит по­иск всех строк, со­дер­жа­щих string, и  вы­полн­ ит за­мен­ у этой са­мой string. Об­рат­ ит­ е вним­ а­ние, что ком­ ан­да: :g/editer/s//editor/g бу­дет де­лать то же, что и: :%s/editer/editor/g Во вто­ром случ­ ае пи­сать нужн­ о нем­ но­го мень­ше. Такж­ е возм­ ож­но ком­ бин­ и­ров­ ать ко­манд­ у :g не тольк­ о с :s, но и с дру­ги­ми ком­ ан­да­ми ex, на­ при­мер :d, :mo и :co. Этим спо­соб­ ом мож­но про­де­лы­вать гло­баль­ные уда­ ле­ния, пер­ е­мещ­ е­ния и коп­ и­ро­ван­ ия.Поиск по шаблону При вы­полн­ е­нии глоб­ аль­ных зам­ ен UNIX-ред­ ак­тор­ ы, та­кие как vi, по­ зво­ля­ют иск­ ать не толь­ко фик­сир­ о­ван­ные строк­ и симв­ ол­ ов, но и  на­ страив­ аем­ ые шабл­ о­ны слов, кот­ ор­ ые наз­ ы­ва­ют­ся рег­ ул­ яр­ны­ми вы­ра­ же­ния­ми. Ког­ да вы ука­зы­вае­те в шабл­ о­не строк­ у сим­вол­ ов-лит­ е­рал­ ов, пои­ ск мо­ жет зат­ ро­нуть неп­ одх­ од­ я­щие вхо­ж­де­ния. Про­блем­ а в том, что од­но и то же слов­ о мож­ ет по-разн­ о­му исп­ ольз­ о­вать­ся. Ре­гул­ ярн­ ые вы­раж­ ен­ ия поз­ во­ляю­ т про­вес­ти по­иск слов в кон­текс­ те. Зам­ ет­ им, что ре­гу­ляр­ные выр­ аж­ ен­ ия можн­ о исп­ оль­зо­вать как в  ком­ ан­дах пои­ с­ка vi / и  ?, так и в ком­ анд­ ах ex :g и :s. В боль­шинс­ тв­ е случ­ а­ев те же ре­гул­ яр­ные выр­ аж­ ен­ ия по­дойд­ ут и для дру­гих ути­лит UNIX, на­при­мер grep, sed, и awk1. Ре­гул­ ярн­ ые вы­раж­ е­ния строя­ тс­ я комб­ и­нир­ о­ва­ние­ м обычн­ ых симв­ о­ лов с ме­тас­ имв­ о­ла­ми2. Ме­та­симв­ ол­ ы и спос­ о­бы их исп­ ольз­ ов­ а­ния пе­ ре­числ­ ен­ ы ниж­ е. 1 Го­раз­до больш­ е инф­ орм­ ац­ ии о рег­ ул­ ярн­ ых выр­ аж­ ен­ ия­ х можн­ о най­ти в двух книг­ ах, из­дан­ных O’Reilly: «sed & awk» Дейл­ а Дог­ ерт­ и (Dale Dou­ghert­ y) и  Арн­ ольд­ а Роб­бинс­ а (Arnold Robbins) и  «Mastering Regular Expressions», Джеф­фри Е.Ф. Фридл­ а (Jeffrey E.F. Friedl) – в переводе «Рег­ ул­ ярн­ ые выр­ а­ же­ния», 3-е издание. – Симв­ ол-Плюс, 2008. 2 Го­вор­ я тех­нич­ ес­ ким язы­ком, их прав­ ильн­ ее на­зы­вать ме­тап­ осл­ е­до­ват­ ель­ нос­ тям­ и, пос­ коль­ку ино­гда два сим­во­ла, стоящ­ ие ряд­ ом, име­ют особ­ ое зна­ че­ние, от­лич­ное от их знач­ ен­ ия по отд­ ельн­ о­сти. Тем не мен­ ее терм­ ин ме­та­ сим­во­лы ши­ро­ко ис­поль­зу­ет­ся в  лит­ ер­ ат­ у­ре по UNIX, поэ­ то­му мы буд­ ем его при­держ­ ив­ ать­ся.

Поиск по шаблону 95Метасимволы, используемые при поиске по шаблону . (точ­ка) Со­отв­ ет­ств­ у­ет лю­бо­му оди­ноч­но­му сим­вол­ у, отл­ ич­ном­ у от пер­ ев­ о­да стро­ки. Не за­быв­ ай­те, что проб­ ел­ ы так­же расс­ матр­ и­ваю­ тс­ я как сим­ во­лы. Нап­ ри­мер, выр­ аж­ ен­ ию p.p соо­ тв­ ет­ст­ву­ют та­кие строк­ и, как pep, pip и pcp. * Со­отв­ етс­ тв­ у­ет пов­ то­ре­нию лю­бог­ о (в том чис­ле и ну­ле­во­го) ко­ли­чес­ т­ва раз симв­ о­ла, стоящ­ ег­ о не­пос­ редс­ т­венн­ о пе­ред звез­дочк­ ой. Нап­ рим­ ер, bugs* соо­ тв­ етс­ тв­ у­ет bugs (одн­ а s), bug (ни одн­ ой s), bugss, bugsss и т. д. Звезд­ оч­ка * мо­жет сто­ять такж­ е пос­ ле ме­та­симв­ ол­ а. К прим­ е­ру, в си­ лу то­го что . (точк­ а) от­ве­ча­ет лю­бо­му симв­ ол­ у, соч­ ет­ ан­ ие .* оз­нач­ а­ет «лю­бое кол­ ич­ ес­ тв­ о люб­ ых симв­ ол­ ов». А вот осо­бый прим­ ер: ко­манд­ а :s/End.*/End/ уда­ляе­ т все симв­ о­лы по­ сле End (ост­ ат­ ок стро­ки за­мен­ яе­ т­ся на «ни­что»). ^ При исп­ оль­зо­ва­нии в  нач­ ал­ е ре­гу­лярн­ ог­ о вы­ра­же­ния эта ком­ ан­да тре­буе­ т, что­бы пос­ лед­ ующ­ ее ре­гул­ ярн­ ое выр­ аж­ е­ние на­хо­дил­ ось в на­ чал­ е стро­ки. На­прим­ ер, ^Part со­отв­ ет­ст­ву­ет Part, стоя­щей в нач­ а­ле стро­ки, а ^... – перв­ ым трем симв­ о­лам в стро­ке. Есл­ и знак ^ стои­ т не в нач­ ал­ е ре­гу­лярн­ ог­ о вы­ра­же­ния, то он озн­ ач­ а­ет сам себя – сим­вол кар­ етк­ и. $ При исп­ оль­зо­ван­ ии в конц­ е рег­ у­ляр­но­го вы­раж­ е­ния тре­бу­ет, чтоб­ ы пред­ше­ст­вую­щее ре­гу­лярн­ ое вы­ра­жен­ ие расп­ о­лаг­ ал­ ось в кон­це стро­ ки. Нап­ ри­мер, here:$ соо­ т­ветс­ т­вуе­ т тольк­ о тем here:, ко­то­рые стоя­ т в  кон­це строк­ и. Ес­ли $ нах­ о­дит­ся не в  конц­ е ре­гу­лярн­ ог­ о вы­ра­же­ ния, то это прос­ то знак долл­ а­ра. \ Ука­зы­ва­ет, что пос­ лед­ ующ­ ий спе­циа­ льн­ ый симв­ ол долж­ ен рас­смат­ ри­ватьс­ я как обыч­ный. К прим­ ер­ у, соч­ е­та­ние \. оз­нач­ ае­ т прос­ то точ­ ку, а  не «лю­бой оди­ночн­ ый симв­ ол»; \* – симв­ ол звез­дочк­ и, а  не «прои­ зв­ ольн­ ое кол­ и­чес­ тв­ о симв­ ол­ ов». \ (об­рат­ная кос­ ая чер­та) пре­ дотв­ ра­щае­ т ин­терп­ рет­ а­цию спе­циа­ ль­но­го сим­во­ла. Это на­зы­вае­ т­ся «эк­ран­ и­ро­ва­ни­ем симв­ ол­ а» (escaping the character). Сам симв­ ол об­ рат­ной чер­ты вво­дит­ся как \\. [] Соо­ тв­ ет­ст­вуе­ т люб­ ом­ у из симв­ о­лов, за­клю­чен­ных в квадр­ атн­ ые скоб­ ки. Нап­ ри­мер [AB] соо­ тв­ етс­ тв­ у­ет A или B, а  p[aeiou]t со­отв­ етс­ тв­ у­ет pat, pet, pit, pot или put. Пос­ лед­ ов­ а­тельн­ ый диап­ а­зон симв­ о­лов можн­ о опр­ е­де­лить, по­ста­вив знак «ми­нус» межд­ у перв­ ым и по­следн­ им сим­ во­лам­ и этог­ о диап­ а­зон­ а. Нап­ ри­мер, [A-Z] бу­дет соо­ т­ветс­ тв­ ов­ ать лю­ бой за­главн­ ой лат­ ин­ской бу­кв­ е, а [0-9] – люб­ ой циф­ре от 0 до 9.

96 Глава 6. Глобальная замена Внут­ри ско­бок мож­но раз­мещ­ ать нес­ коль­ко диап­ а­зон­ ов, а  так­же смесь диа­па­зо­нов и отд­ ельн­ ых симв­ о­лов. На­прим­ ер, [:;A-Za-z( )] со­ от­вет­ст­вуе­ т всем бу­кв­ ам и че­тыр­ ем знак­ ам пре­пин­ а­ния. В сам­ ом нач­ а­ле разв­ ит­ ия vi и ре­гул­ ярн­ ых выр­ аж­ е­ний пред­пол­ а­га­ лось, что они бу­дут ра­бот­ ать толь­ко для на­бо­ра сим­во­лов ASCII. В эпох­ у глоб­ а­лиз­ ац­ ии сов­ рем­ енн­ ые сис­те­мы подд­ ерж­ и­ваю­ т ло­ка­ли, что дае­ т раз­ную инт­ ерп­ рет­ ац­ ию сим­во­лов, леж­ а­щих меж­ду a и z. Что­бы по­луч­ ить пра­виль­ные рез­ уль­та­ты, нужн­ о ис­польз­ о­вать в ре­ гул­ ярн­ ых выр­ аж­ ен­ и­ях спе­ци­альн­ ые кон­стр­ ук­ции POSIX (о  них чуть ниж­ е) и из­бе­гать диа­паз­ он­ ов ви­да a-z. В скобк­ ах боль­шая часть мет­ а­симв­ о­лов тер­ я­ет свое спе­ци­аль­ное зна­ чен­ ие, поэ­ том­ у при их ис­польз­ ов­ ан­ ии в ка­чес­ тв­ е обычн­ ых симв­ ол­ ов экр­ ан­ и­ров­ а­ние не треб­ уе­ тс­ я. Един­ст­вен­ные симв­ о­лы, кот­ о­рые нуж­ но экр­ ан­ и­ров­ ать внут­ри ско­бок – это \, - и  ]. Здесь де­фис (-) имее­ т зна­че­ние указ­ а­те­ля диап­ а­зон­ а, а чтоб­ ы исп­ оль­зов­ ать «на­стоя­щий» де­фис, его след­ у­ет пос­ та­вить внутр­ и скоб­ ок на пер­вом мес­те. Кар­ етк­ а (^) име­ет особ­ ое зна­че­ние, толь­ко есл­ и явл­ я­ет­ся пер­вым симв­ ол­ ом в  скоб­ках, но и  в  этом случ­ ае ее зна­че­ние от­ли­чае­ тс­ я от обыч­но­го мет­ а­симв­ ол­ а ^. Буд­ уч­ и перв­ ым зна­ком в квадр­ ат­ных скоб­ ках, ^ ме­ня­ет их зна­чен­ ие на обр­ атн­ ое, по­сле че­го они буд­ ут со­отв­ ет­ ст­во­вать люб­ ом­ у из симв­ ол­ ов не из спис­ ка. На­прим­ ер, [^0-9] обо­зна­ ча­ет про­из­воль­ный не­циф­ров­ ой симв­ ол. \( \) Со­хран­ яе­ т шабл­ он, за­клю­чен­ный меж­ду \( и \), в спе­циа­ льн­ ом мест­ е или врем­ ен­ном бу­фе­ре (hold buffer). Так­ им спос­ о­бом можн­ о сох­ ра­ нять до де­вят­ и бу­фе­ров. Нап­ рим­ ер, шаб­лон: \(That\) or \(this\) сох­ ра­ня­ет That во врем­ ен­ный буф­ ер но­мер 1, а this – во вре­мен­ный бу­фер ном­ ер 2. Со­хра­ненн­ ые шаб­лон­ ы мог­ ут быть «восп­ ро­из­вед­ ен­ ы» с по­мо­щью конс­ тр­ укц­ ий от \1 до \9. На­при­мер, что­бы фраз­ а That or this пре­вра­тил­ ась в this or That, можн­ о вве­сти: :%s/\(That\) or \(this\)/\2 or \1/ Внутр­ и строк­ и по­иск­ а или за­мен­ ы такж­ е мож­но исп­ оль­зов­ ать обо­ зна­чен­ ие \n. Нап­ ри­мер: :s/\(abcd\)\1/alphabet-soup/ мен­ я­ет abcdabcd на alphabet-soup1. \< \> Соо­ тв­ ет­ств­ уе­ т сим­во­лам в на­ча­ле (\<) или в кон­це (\>) сло­ва. Нач­ а­ло и кон­ ец слов­ а опр­ е­де­ляю­ тс­ я либ­ о по знак­ у пре­пи­нан­ ия, ли­бо по про­ 1 Это ра­бот­ ае­ т в vi, nvi и Vim, но не ра­бо­та­ет в elvis и vile.

Поиск по шаблону 97 бе­лу. На­прим­ ер, вы­ра­жен­ ие \<ac бу­дет со­отв­ ет­ст­вов­ ать тольк­ о сло­ вам, нач­ ин­ аю­щим­ся на ac, та­ким как action. В свою очер­ едь, выр­ а­же­ ние ac\> со­от­вет­ст­ву­ет слов­ ам, оканч­ и­ваю­щим­ся на ac, на­прим­ ер ma­ niac, а сло­во react не от­ве­ча­ет ни од­но­му из этих выр­ аж­ е­ний. Об­ра­ти­ те вним­ а­ние, что, в отл­ и­чие от \(...\), их мож­но ис­поль­зов­ ать не в па­ре. ~ Со­от­вет­ст­ву­ет рег­ у­лярн­ ом­ у выр­ аж­ ен­ ию, ко­то­рое исп­ ольз­ о­вал­ ось в пос­ ледн­ ем пои­ ск­ е. Так, ес­ли вы ис­кал­ и The, то сло­во Then мож­но най­ти при по­мощ­ и /~n. Данн­ ый шабл­ он прим­ е­няе­ тс­ я толь­ко при обычн­ ом пои­ с­ке (кла­виш­ ей /)1. Его нель­зя зад­ ать в ка­че­ст­ве шабл­ о­ на в ко­ман­де под­стан­ овк­ и, но он име­ет схо­жее знач­ ен­ ие при ис­поль­ зо­ва­нии в ка­чес­ т­ве част­ и стро­ки за­мен­ ы в ком­ анд­ е подс­ та­нов­ки. Все кло­ны подд­ ер­жив­ аю­ т не­обя­зат­ ельн­ ый (расш­ и­рен­ный) син­такс­ ис ре­гу­ляр­ных вы­ра­жен­ ий. За под­роб­но­стям­ и обр­ ащ­ айт­ есь к раз­дел­ у «Рас­ шир­ енн­ ые ре­гул­ яр­ные выр­ а­же­ния» на стр. 152.Выражения в скобках в стандарте POSIX Мы рас­ска­зал­ и об ис­поль­зо­ван­ ии ско­бок для со­пос­тавл­ ен­ ия с лю­бым из зак­ лю­чен­ных в них симв­ о­лов, нап­ рим­ ер [a-z]. Станд­ арт POSIX ввод­ ит доп­ олн­ ит­ ель­ные функ­цион­ аль­ные возм­ ожн­ о­сти для со­пост­ ав­лен­ ия с бу­кв­ а­ми друг­ их ал­фа­ви­тов. Нап­ ри­мер, франц­ узс­ кое è – это бук­ ­ва, но в  обычн­ ый класс симв­ о­лов [a-z] она не вход­ ит. До­пол­нит­ ельн­ о в  этом стан­дарт­ е вве­ден­ ы пос­ лед­ ов­ а­тельн­ о­сти симв­ ол­ ов, с  кот­ о­ры­ми нужн­ о обр­ а­щать­ся как с един­ ым бло­ком при по­иск­ е со­отв­ етс­ тв­ ия и при упо­ря­ доч­ ен­ ии (сор­ти­ров­ке) стро­ков­ ых данн­ ых. Кром­ е тог­ о, в  POSIX станд­ ар­тиз­ и­ров­ ан­ а тер­ми­нол­ ог­ ия. Нап­ ри­мер, групп­ а сим­во­лов в скобк­ ах на­зы­ва­ет­ся груп­пов­ ым вы­раж­ е­ние­ м (bra­cket expression). Внут­ри так­ их выр­ аж­ ен­ ий, пом­ им­ о лит­ е­раль­ных симв­ ол­ ов (a, ! и про­чие), мо­гут прис­ ут­ств­ о­вать доп­ олн­ ит­ ельн­ ые комп­ о­нен­ты: Клас­сы симв­ о­лов Класс симв­ ол­ ов POSIX со­стои­ т из клю­чев­ ых слов, зак­ люч­ енн­ ых меж­ ду [: и  :]. Клю­чев­ ые слов­ а опис­ ы­ва­ют разл­ ич­ные клас­сы сим­вол­ ов, так­ ие как алф­ ав­ ит­ные, управл­ яю­щие симв­ о­лы и т. д. (см. табл. 6.1). Объ­еди­нен­ные сим­вол­ ы Объ­еди­ненн­ ый симв­ ол – это мног­ о­симв­ ольн­ ая пос­ лед­ о­ват­ ельн­ ость, расс­ матр­ ив­ ае­мая как един­ ое цел­ ое. Ее сос­ тавл­ яю­ т сим­вол­ ы, за­клю­ чен­ные меж­ду [. и .].1 Это до­воль­но странн­ ая осо­бен­ность ориг­ и­наль­ног­ о vi. По­сле ее исп­ оль­зо­ва­ ния со­хран­ ен­ным шаб­лон­ ом по­ис­ка ста­нов­ ит­ся но­вый текст, на­бран­ный по­ сле ~, а не сов­ о­куп­ный но­вый шаб­лон, как можн­ о бы­ло бы ожи­дать. Кро­ме тог­ о, ни один из клон­ ов так се­бя не ве­дет. Так что хоть так­ ая функ­ция и су­ ще­ст­ву­ет, мы не буд­ ем рек­ ом­ ен­до­вать ею польз­ ов­ ать­ся.

98 Глава 6. Глобальная заменаКласс­ ы эк­ви­вал­ ент­нос­ ти Класс эквивалентности – это спи­сок симв­ ол­ ов, ко­тор­ ые счи­та­ютс­ я эк­вив­ а­лент­ны­ми, на­прим­ ер e и è. Этот класс со­держ­ ит имен­ ов­ анн­ ый эле­мент из конк­ рет­ной ло­ка­ли, стоящ­ ий межд­ у [= и =].Все три кон­ст­рукц­ ии должн­ ы нах­ од­ итьс­ я в квадр­ атн­ ых скобк­ ах скоб­ко­во­го выр­ аж­ е­ния. На­прим­ ер, [[:alpha:]!] соо­ тв­ ет­ст­ву­ет лю­бо­му один­ оч­но­му сим­вол­ у или вос­клиц­ а­тельн­ ом­ у зна­ку, а [[.ch.]] – объ­еди­нен­ном­ у эле­мент­ у ch, а не бук­ в­ ам c или h. Во фран­цуз­ской ло­кал­ и [[=e=]] со­отв­ ет­ст­ву­ет бук­ ­вам e, è и é. Клас­сы и сим­вол­ ы соо­ т­ветс­ тв­ ия пок­ аз­ а­ны в табл. 6.1.Таб­лиц­ а 6.1. Клас­сы сим­вол­ ов POSIXКласс Со­отв­ ет­ст­вующ­ ие симв­ о­лы[:alnum:] Бук­ в­ енн­ о-циф­ро­вые сим­во­лы[:alpha:] Ал­фав­ ит­ные симв­ о­лы[:blank:] Сим­во­лы проб­ е­ла и та­бу­ляц­ ии[:cntrl:] Управ­ляю­щие сим­во­лы[:digit:] Цифр­ о­вые сим­во­лы[:graph:] Печ­ ат­ ае­мые и вид­ и­мые сим­вол­ ы (не-про­бе­лы)[:lower:] Строчн­ ые сим­во­лы[:print:] Пе­ча­таем­ ые симв­ ол­ ы (включ­ ая про­бель­ные)[:punct:] Зна­ки преп­ ин­ ан­ ия[:space:] Про­бель­ные сим­вол­ ы[:upper:] Про­пис­ные сим­вол­ ы[:xdigit:] Шес­ тн­ ад­ ца­те­рич­ные цифр­ ы В сист­ е­мах HP-UX 9.x (и бо­лее нов­ ых) vi подд­ ерж­ и­ва­ет скобк­ ов­ ые вы­ ра­жен­ ия POSIX. То же ка­сае­ тс­ я /usr/xpg4/bin/vi (но не /usr/bin/vi) в So­ la­ris. Эти возм­ ож­нос­ ти такж­ е реа­ли­зо­ван­ ы в nvi, elvis, Vim и vile. В ча­ стн­ о­сти, со­врем­ енн­ ые сист­ ем­ ы GNU/Linux чув­ст­вит­ ельн­ ы к  ло­ка­ли, выб­ ран­ной во врем­ я уст­ а­новк­ и, поэ­ то­му можн­ о ожи­дать раз­ умн­ ых ре­ зульт­ а­тов при пои­ с­ке прописных и  строчных букв, исп­ ольз­ уя скоб­ко­ вые вы­раж­ е­ния POSIX.Метасимволы, используемые в строках замены При гло­бальн­ ой за­ме­не опис­ анн­ ые вы­ше мет­ ас­ имв­ о­лы рег­ ул­ яр­ных вы­ ра­жен­ ий име­ют особ­ ое знач­ ен­ ие тольк­ о в стро­ке пои­ с­ка (перв­ ой част­ и) ком­ ан­ды. На­при­мер, при исп­ оль­зов­ ан­ ии след­ ую­щей ком­ ан­ды: :%s/1\. Start/2. Next, start with $100/

Поиск по шаблону 99обр­ ат­ и­те вним­ а­ние, что в строк­ е за­ме­ны симв­ ол­ ы . и $ по­ним­ аю­ тс­ я бук­вальн­ о, так что вам не нуж­но их экр­ а­ни­ров­ ать. Бо­лее тог­ о, предп­ о­ло­жим, что вы вве­ли: :%s/[ABC]/[abc]/gЕсл­ и в данн­ ом случ­ ае вы рас­счи­ты­ва­ли зам­ е­нить A на a, B на b и C на c,то бу­дет­ е разо­ ча­ров­ а­ны. Пос­ коль­ку в стро­ке за­ме­ны скоб­ки вед­ ут се­бякак обычн­ ые сим­вол­ ы, эта ко­манд­ а зам­ ен­ ит люб­ ое вхож­ ­ден­ ие A, B илиC на пя­ти­симв­ ольн­ ую строк­ у [abc].Для разр­ еш­ е­ния по­доб­ной про­блем­ ы сле­дуе­ т как-то опр­ е­дел­ ить ре­гул­ и­руе­мую стро­ку зам­ е­ны. К счас­ тью, су­ще­ст­ву­ют до­полн­ и­тельн­ ые ме­та­симв­ о­лы, имеющ­ ие осо­бое зна­че­ние в строк­ е зам­ е­ны.\n За­ме­ня­етс­ я на текст, со­от­ветс­ тв­ ую­щий n-му шаб­ло­ну, сох­ ра­нен­но­му ра­нее с пом­ о­щью ком­ анд \( и \), где n – это числ­ о от 1 до 9, и сох­ ра­ ненн­ ые ра­нее шаб­ло­ны (нах­ о­дя­щие­ся во вре­мен­ных буф­ ер­ ах) счи­та­ ютс­ я с лев­ о­го края строк­ и (об ис­поль­зов­ ан­ ии \( и \) чи­тай­те в пред­ ы­ дущ­ ем разд­ е­ле «Мет­ ас­ имв­ о­лы, исп­ оль­зуем­ ые при пои­ с­ке по шабл­ о­ ну» на стр. 95).\ Тре­буе­ т, чтоб­ ы сле­дующ­ ий спе­ци­альн­ ый симв­ ол расс­ матр­ и­валс­ я как обычн­ ый. Обр­ атн­ ая кос­ ая чер­та яв­ля­ет­ся та­ким же ме­тас­ имв­ о­ лом в строк­ е зам­ ен­ ы, как и в стро­ке по­ис­ка. Чтоб­ ы опр­ ед­ ел­ ить сам симв­ ол обр­ атн­ ой ко­сой черт­ ы, введ­ ит­ е две черт­ ы подр­ яд (\\).& Нах­ о­дясь в строк­ е зам­ е­ны, знак & за­ме­няе­ тс­ я на весь текст, со­отв­ ет­ ств­ ую­щий строк­ е по­ис­ка. Это по­лезн­ о, есл­ и вам хоч­ ет­ся изб­ еж­ ать пов­ тор­но­го ввод­ а тек­ста: :%s/Yazstremski/&, Carl/ Стро­ка за­ме­ны озн­ ач­ а­ет Yazstremski, Carl. Такж­ е & мож­ ет зам­ ен­ ять пер­ ем­ ен­ный шабл­ он (в зав­ и­сим­ о­сти от рег­ ул­ яр­но­го выр­ аж­ ен­ ия). На­ прим­ ер, что­бы зак­ лю­чить каж­дую из строк с 1-й по 10-ю в круг­лые скоб­ки, введ­ и­те: :1,10s/.*/(&)/ Шабл­ он по­иск­ а соо­ т­вет­ст­вуе­ т всей стро­ке, а симв­ ол & «вос­прои­ з­во­ дит за­но­во» всю строк­ у из ваш­ ег­ о тек­ста.~ Име­ет знач­ е­ние, сход­ное с тем, ко­тор­ ое ис­польз­ уе­ тс­ я в строк­ е пои­ с­ ка: найд­ енн­ ая строк­ а за­мен­ яе­ тс­ я на текст, оп­ред­ е­лен­ный в по­след­ ней ком­ ан­де подс­ тан­ овк­ и. Это по­лезн­ о при пов­ то­рен­ ии ис­правл­ ен­ ий. На­при­мер, можн­ о в  одн­ ой строк­ е нап­ ис­ ать :s/thier/their/, а  в  дру­ гой – :s/thier/~/. При этом строк­ и по­ис­ка не обяз­ а­тельн­ о должн­ ы быть один­ а­ков­ ым­ и.


Like this book? You can publish your book online for free in a few minutes!
Create your own flipbook