regulyarnyie-vyirazheniya-osnovyi (852744), страница 18
Текст из файла (страница 18)
А пока используем то, что намуже известно, но применим новые приемы.102Глава 9. Разметка документа теrами HTMLSПреобразование npocтoro текстас помощью редактора sedДобавим дополнительную разметку в самом начале текста, хранящегося в файле rime.txt. Мы сделаем это с помощью команды вставки (i \). Перейдя в каталог, в котором находится файл rime.txt, введите в командной строке следующую команду.sed '1 i\<!DOCTYPE html>\<html lang="en">\<head>\<title>The Rime of the Ancyent Marinere (1798)</title>\<meta charset="utf-8"/>\</head>\<body>\q' rime.txtПосле того как вы нажмете клавишу <Enter> или <Return>, вы должны увидеть примерно следующий вывод с тегами в самом начале.<!DOCTYPE html><html lang="en"><head><title>The Rime of the Ancyent Marinere (1798)</title><meta charset="utf-8"/></head><body>ТНЕ RIME OF ТНЕ ANCYENT МARINERE, IN SEVEN PARTS.Команда, которую вы только что ввели, фактически не изменила файл; она всеголишь обеспечила вывод строк на экран.
О том, как записать изменения в файл, будетрассказано позднее.Замена текста с помощью редактора sedВ приведенном ниже примере редактор sed находит первую строку и захватывает всеее содержимое в груnпу с использованием экранированных скобок \ ( и \) . Экранирование скобок в захватывающих группах является обязательным требованием, если тольковы не используете опцию -Е (к этому вопросу мы еще вернемся).Начало строки обозначается символом ", а конец - символом $. Обратная ссылка \ 1извлекает сохраненное группой содержимое в элемент ti tle, который выводится с отступом в один пробел.А теперь выполните следующую команду:sed 'ls/ л \(.*\)$/ <title>\l<\/title>/;q' rime.txtРезультирующая строка будет выглядеть так:<title>THE RIME OF ТНЕ ANCYENT МARINERE, IN SEVEN PARTS.</title>Теперь видоизменим команду.Глава 9. Ра3метка документа теrами HTMLS103sed -Е 'ls/л(.*)$/<!DOCTYPE html>\<html lang="en">\<head>\<title>\l<\/title>\<\/head>\<body>\<hl>\l<\/hl>\/;q' rime.txtОбсудим отдельные составляющие этой команды.• Опция -Е означает использование расширенных выражений,или ERE(которые нетреб уют экранирования скобок и т.п.)• Команда подстановки (s) запоминает строку 1 в захватывающей группе(\ л (.\*)$),что обеспечивает возможность повторного использования текста посредством ссылки \1.• Далее создаются НТМL-теrи,причем символы новой строки экранируются символами обратной косой черты(\).• После этого сохраненный текст вставляется в элементы t i t 1 е и h 1 посредствомссылки \1.• Вывод на экран оставшейся части текста поэмы блокируется посредством команды q.Результат выполнения этой команды должен быть след ующим.<!DOCTYPE html><html lang="en"><head><title>THE RIМE OF ТНЕ ANCYENT МARINERE, IN SEVEN PARTS.</title></head><body><hl>THE RIME OF ТНЕ ANCYENT МARINERE, IN SEVEN PARTS.</hl>Обработка римских цифр в редакторе sedПоэма разделена на семь частей, пронумерованных римскими цифрами.
Кроме того,имеется заголовок "ARGUMENT". След ующая команда sed предназначена для захвата этого заголовка и римских цифр и окружения их тегами h2:sed -En 's/л(ARGUМENT\. II{0,3}V?I{0,2}\.)$/<h2>\l<\/h2>/p'�rime.txtВот результат ее работы.<h2>ARGUМENT\.</h2><h2>I.</h2<h2>II.</h2<h2>III.</h2<h2>IV.</h2<h2>V.</h2<h2>VI.</h2<h2>VII.</h2104Глава 9. Разметка документа тегами HTMLSРассмотрим более подробно отдельные составляющие этой команды.• Опция -Е включает режим расширенных регулярных выражений, а опция -n подавляет вывод каждой строки, заданный в sed по умолчанию.• Команда подстановки (s) захватывает заголовок и семь римских цифр в верхнемрегистре в диапазоне от I до Vll, располагаемых в отдельных строках с точкой после цифры.• Затем команда s извлекает каждую строку захваченного текста и помещает еев отдельный элемент h2.• Флаг р в конце команды подстановки выводит результат на экран.Обработка отдеnыоrо абзаца в редакторе sedСледующая команда находит абзац в строке 5:sed -En '5s/ л ([A-Z].*)$/<р>\1<\/р>/р' rime.txtи помещает его в элемент р.<p>How а Ship having passed the Line was driven Ьу Stormsto the cold Country towards the South Pole; and how fromthence she made her course to the tropical Latitude of theGreat Pacific Ocean; and of the strange things that befell;and in what manner the Ancyent Marinere came back to hisown Country.<p>Я понимаю, что пока что мы продвигаемся очень мелкими шагами, но наберитесь терпения, и вскоре я сведу все в единое целое.Обработка строк поэмы в редакторе sedСледующий шаг заключается в разметке строк поэмы с помощью показанной нижекоманды.sed -Е '9s/ л [ ]*(.*)/ <p>\l<br\/>/;�10,832s/ л ([ ]{5,7).*)/\l<br\/>/;�833s/ л (.*)/\1<\/р>/' rime.txtЗдесь команды редактора sed жестко привязаны к конкретным номерам строк.
В общем случае такой подход неприемлем, но если вы знаете, с чем имеете дело, то он работает довольно неплохо.• Команда s захватывает строку 9 (первая строка стихотворной части поэмы) и после присоединения к ней нескольких пробелов вставляет начальный тег р и присоединяет тег br (разрыв строки) к концу строки.•В диапазоне номеров строк от 10 до 832 к концу каждой строки, начинающейсяс 5-7 пробелов, присоединяется тег br.•К строке 833, последней строке поэмы, вместо тега br команда s присоединяетконечный тег р.Вот как выглядит часть результирующей разметки.Гnава 9.
Разметка документа тегами HTMLS105<p>It is an ancyent Marinere,<br/>And he stoppeth one of three:<br/>"Ву thy long grey beard and thy glittering eye<br/>"Now wherefore stoppest me?<br/>"The Bridegroom's doors are open'd wide<br/>"And I am next of kin;<br/>"The Guests are met, the Feast is set,--<br/>"May'st hear the merry din.--<br/>Кроме того, вы можете создать промежутки между стихами, заменив пустые строкитегами br:sed -Е 's/ л $/<br\/>/' rime.txtВот как выглядит результат.Не prayeth best who loveth best,All things both great and small:For the dear God, who loveth us,Не made and loveth all.<br/>The Marinere, whose еуе is bright,Whose beard with age is hoar,Is gone; and now the wedding-guestTurn'd from the bridegroom's door.<br/>Не went, like one that hath been stunn'dAnd is of sense forlorn:А sadder and а wiser manНе rose the morrow morn.Я моr бы бесконечно долго заниматься приукрашиванием внешнего вида текста, расставляя теги и пробелы в нужных местах.
Рекомендую вам самостоятельно попрактиковаться в этом.Добавяение теrовДобавим в конце поэмы некоторые дополнительные теги. В приведенной ниже команде символ$ находит последнюю строку (конец файла), а с помощью команды \а в этомместе добавляются закрывающие теги body и html.sed '$ а\<\/body>\<\/html>\' rime.txtПосле применения этой команды последние строки файла будут выглядеть так.Не went, like one that hath been stunn'dAnd is of sense forlorn:А sadder and а wiser manНе rose the morrow morn.</body></html>Ну что же, редактор sed потрудился на славу!106Глава 9.
Разметка документа тегами HTMLSА можно ли выполнить все описанные до этого изменения текста поэмы за один раз�Вам известно, что именно надо делать. Вы уже прошли через это. Осталось лишь собратьвсе команды в один файл и использовать в редакторе sed опцию - f.Испоnьзование командноrо файnа в редакторе sedВ этом примере представлен файл html.sed, в котором собраны все описанные ранеекоманды редактора sed, применявшиеся для добавления НТМL-тегов в текст поэмы,и пара других команд. Этот файл мы используем для преобразования файла rime.txt в документ HTML с помощью редактора sed.
Нумерация поможет вам проследить за тем, чтопроисходит в данном сценарии.# ! /usr/bin/sed Оls/л(.*)$/<!DOCTYPE html>\ $<html lang="en">\<head>\<title>\1<\/title>\<\/head>\<body>\<hl>\1<\/hl>\/s/л(ARGUMENTII{0,3}V?I{0,2})\.$/<h2>\1<\/h2>/ 05s/л([A-Z].*) $/<р>\1<\/р>/ 09s/л[ ]*(.*)/ <p>\l<br\/>/ 010,832s/л([ ](5,7}.*)/\l<br\/>/ ФВЗЗs/л(.*)/\1<\/р>/ 813,$s/л$/<br\/>/ 0$ а\ 0<\/body>\<\/html>\О Первая пара символов(#! - магическая строка) указывает на то, что данный файлявляется сценарием; оставшаяся часть первой строки задает местоположение соответствующего командного интерпретатора (sed).е Заменить {s) строку 1 последующими тегами. Символ обратной косой черты (\)указывает на то, что текст, который вы хотите добавить, продолжается на следующей строке, и поэтому необходимо вставить символ новой строки.
Вставить заголовок поэмы, взятый из строки 1 с помощью переменной \1, в качестве содержимого элементов title и hl.О Окружить заголовки и римские цифры тегами h2.О Обработать строку 5, заключив вводный абзац в элемент р.0 Обработать строку 9, добавив открывающий тег р в начале строки и тег br в концестроки.0 Обработать строки с номерами от 9 до 832, добавив тег br в конце каждой строки,начинающейся с определенного количества пробелов.8 В конце текста поэмы добавить закрывающий тег р.0 После строки 13 заменить каждую пустую строку тегом br.0 Добавить несколько тегов в конце ($) документа.Гnава 9. Разметка документа тегами HTMLS107Чтобы применить этот командный файл к файлу rime.txt, введите следующую строкуи нажмите клавишу <Enter> or <Return>:sed -Е -f html.sed rime.txtВывод можно перенаправить в файл:sed -Е -f html.sed rime.txt > rime.htmlЧтобы увидеть результаты своей работы, откройте файл rime.html в браузере (рис.
9.1).С_, file:///C:/cyg\Vin64/h01ne/Ale></r1me.htmlТНЕ Rll\IE OF ТНЕ �CYENT 1\IARINERE, IN SEYEN PARTS.ARGt.ШENTНо"· а Slup h.1.-шg pas.sC"d tltC' LwC" \\·,н dп,·С"11 Ьу Sronus. 10 th(' со]с\ Counn:,• roю1:rds 111(' Soшl1 PolC" ансl Ьо\\" frotн tl1C'HCC' s.hC" madC" litr coor"C"to the- 11·opical L,юrodC" ofthC' GrC"at Pacifi.c OcC".m.. and oftl1C' srr,,нgC' rhing'> tl1a1 lxftll анd m ,Yl1.:,1 maru.1�- tl1C' A11C�C'1ll �larш�C' сtШ1С' \юС"k tohн, o\\·n Cow1try1[t 1\ All i'IПC)'rnt �OfШC'fC'And ltC' SIOP}X'th OUC' of tllfC'('ВУ tJ1y long g:rey bC".:ird <шd thy яl1nC"rшy �-С'):о"· ""llC"rC'forC' s.top�st 1ue-"'111С' BridC"�rooш � doors МС' opa1·d \\'tde"AJ1d I аш некr of k.ш"111С' G1tC'St3 afC' ШС'f. tllC' FC"<Нit 1\ SC'f."�1ny'sr hC".t.r tltC' ШС'ТТ)' dш But яйl he l1olds tl1e \YC"dduig-gttC''Ьt-Th�C' ,п,\ n Shtp. quoth h�-"Xny 1fthou·S1 �ot а 1aнg-hsome tn1e·�1мu1�е I соше \Пd1 Ш('Рис.