Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Сало 17 -24.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
31.24 Кб
Скачать

17. Порядок виконання команд

Кома́нди перехо́дуКома́нди переда́чі керування (анг. branch instructions) — різновид команд передачі управління в архітектурах системи команд ЕОМ, які змінюють послідовний порядок виконання програми (тобто перезавантажують лічильник команд адресою, записаною в самій команді переходу, а не збільшуючи його значення на довжину поточної команди).

Команди переходу можуть бути умовними (conditional brahch) та безумовними (unconditional branch).

Залежно від реалізації мови програмування (високого чи низького рівня), команди передачі управління можуть мати свої особливості. Так, у мовах низького рівня, типу асемблера, реалізація команди умовного переходу може мати вигляд jz (), jnz () — перехід за нульовою (ненульовою) умовою.

18. Регулярні вирази

Регулярний вираз (в програмуванні) — це рядок, що описує або збігається з множиною рядків, відповідно до набору спеціальних синтаксичних правил. Вони використовуються в багатьох текстових редакторах та допоміжних інструментах для пошуку та зміни тексту на основі заданих шаблонів. Багато мов програмування підтримують регулярні вирази для роботи з рядками. Наприклад, Perl та Tcl мають потужний механізм для роботи, вбудований безпосередньо в їх синтаксис. Завдяки набору утиліт (включаючи редактор sed та фільтрgrep), що входили до складу дистрибутивів Юнікс регулярні вирази стали відомими та поширеними.

Регулярні вирази базуються на теорії автоматів та теорії формальних мов. Ці розділи теоретичної кібернетики займаються дослідженням моделей обчислення (автомати) та способами описання та класифікації формальних мов.

Регулярний вираз (часто називається шаблон) є послідовністю, що описує множину рядків. Ці послідовності використовуються для того, аби дати точне описання множини, не перелічуючи всі її елементи. Наприклад, множина, що складається із слів «грати» та «ґрати» може бути описана регулярним виразом «[гґ]рати». В більшості формалізмів, якщо існує регулярний вираз, що описує задану множину, тоді існує нескінченна кількість варіантів, які описують цю множину.

19. Сімейство команд Grep

Команда grep має два варіанти - egrep і fgrep, тому говорять про сімейство програм grep. Спочатку опишемо стандартну команду grep, а потім розглянемо її варіанти.

конструкція

$ Grep [ прапори ] шаблон імена_файлов

проводить пошук в пойменованих файлах ( імена файлів розділяються пробілами ) або в стандартному вхідному потоці і виводить на друк кожен рядок , в яку входить шаблон. Команда grep неоціненна для пошуку змінних в програмах і слів у документах , а також для вибору частини вихідного потоку програми :

$ Grep - n variable * . [ Гл ]

Пошук variable в тексті на Сі .

$ Grep From $ Mail

Друк заголовків повідомлень з поштової посилки .

$ Grep From $ Mail | grep - v mary

Заголовки , які полуенни немає від адресата mary .

$ Grep - y mary $ HOME / lib / phone - book

Пошук номера mary .

 Прапор - n ініціює висновок номерів рядків , прапор - v змінює на протилежне значення умови , а флаг- y допускає зіставлення малих літер з шаблону з прописними буквами з файлу (але прописні літери таки можуть зіставлятися тільки з прописними ) .

У всіх розглядалися досі прикладах проводився пошук звичайних рядків з літер і чисел . Але команда grep може шукати і складніші шаблони : вона інтерпретує вираз згідно простому мови для опису рядків. З технічної точки зору шаблон представляє в деякій мірі обмежену форму специфікацій рядків , звану регулярним виразом. Команда інтерпретує такі ж регулярні вирази , як і редактор ed . Насправді , команда grep була створена ( за один вечір ) прямим редагуванням ed .

Регулярні вирази характеризуються тим , що ряду символів , таким , як * і т. п. , приписується спеціальне значення, яке використовується інтерпретатором . Є ще кілька метасимволов , але , на жаль , з різними значеннями. У наведеній далі таблиці показані всі метасимволи регулярних виразів , і ми коротко їх тут розглянемо.

Метасимволи ^ і $ прив'язують шаблон до початку ( ) ^ або кінця ($) рядка.

наприклад ,

$ Grep From $ MAIL

шукає рядки , содежащіе From у вашій поштовій посилці , але

$ Grep ' From ' $ MAIL

видає рядки, що починаються з From , які , найімовірніше , будуть заголовними рядками повідомлень. Метасимволи регулярних виразів перетинаються з метасимвол інтерпретатора , тому завжди має сенс укладати шаблони команда grep в апострофи .

Команда grep допускає класи символів , подібні тим, що використовується інтерпретатором : так , [ az ] задає будь-яку малу літеру . Але є й відмінності - якщо клас символів команди grep починається з символу слабкого наголосу ^ , то шаблон задає будь-який символ , крім входять у даний клас . Значить , [^ 0-9] задає будь-який символ , крім цифри . Як у інтерпретаторі , зворотна дробова риса екранує символи ] і - в класі символів , але команди grep і ed вимагають , щоб ці символи використовувалися там , де їх значення недвозначно . Наприклад , шаблон [] [-] задає відкривати або закривати квадратну дужку або знак мінус.

Точка ' .' еквівалентна '?' в інтерпретаторі : вона задає будь-який символ . ( Точка по всій видимості , є символ , призначення якого різному для різних програм. )

Нижче наводяться два приклади :

$ Ls - l | grep '^ d' Список імен вкладених каталогів

$ Ls - l | grep '^ - . - Rw ' Список файлів , доступних всім для читання і запису.

Символ '^ ' і сім точок задають будь-які сім символів на початку рядка; в разі застосування до вихідного потоку команди ls - l зачепити будь-який рядок права доступу.

Операція " повторювач " ( '*' ) застосовна у вираженні до передує її символу або метасимвол (включаючи клас символів ), і разом вони позначають будь-яке число входжень символу або метасимвола . Наприклад , x * задає послідовність літер x довільної довжини , [ a - zA - Z] - будь-який рядок символів , а * x - все до останнього символу x в рядку включно.

Необхідно відзначити кілька важливих моментів пов'язаних з повторювачем .

По-перше , повторювач діє тільки на один символ , тому xy * відповідає x , за яким йдуть yy - , але не послідовності типу xyxyxy .

По-друге , будь-яке число включає нуль , тому якщо ви хочете , щоб символ був присутній , в шаблоні його потрібно повторити. Наприклад , правильним виразом , що задає рядок букв , є таке : [ a - zA - Z] [ a - zA - Z ] * ​​(буква, за якою слід нуль або більше літер). Регулярний вираз . * Відповідає * , тобто метасимвол інтерпретатора , використовуваному для імен файлів. Жодне регулярний вираз команди grep не відповідає символу перекладу рядка : вислови зіставляються з кожним рядком окремо. Регулярні вирази роблять команду grep простою мовою програмування. Згадайте , що друге поле файлу паролів містить зашифрований пароль.

Наведена нижче команда проводить пошук користувачів , що не мають пароля

$ Grep ' [ : ] * :: ' / etc / password

Шаблон розшифровується так : початок рядка , будь-яке число символів , відмінних від двокрапки , дві двокрапки .

Коди завершення роботи команд сімейства grep :

0 Знайдена хоча б один рядок із заданим шаблоном .

1 не знайдено жодного рядка із заданим шаблоном .

> 1 Виявлена ​​синтаксична помилка чи вказані файли недоступні для читання.

Обробка помилок : при невірному шаблоні або прапорі команда завершується . Якщо який-небудь з файлів недоступний для читання , grep виводить повідомлення , код завершення більше 1 , але триває обробка наступного файлу .