Функция контекстной замены

Формат:

(2)s/< Регулярное выражение > /< Замена > /< флаги >

Функция s заменяет вхождение < Регулярного выражения > в pattern space на < Замену > .

< Регулярное выражение > : Аналогично выше данному, но может быть заключено не в "/ /" а в любые другие символы (не " " (пробел) и не newline ).

< Замена > : Любой набор символов. Используются специальные символы:

"& " - Заменяется на строку, указанную в регулярном выражении.

"\d" - , где d - цифра, указывает на d -тое выражение, заключенное в "\(","\)" в регулярном выражении.

< Флаги > :

g - Глобальная замена: заменить все вхождения в строке.

p - Печатать (выводить на output ) строки, в которых была осуществлена замена.

w wfile - Выводить в файл wfile строки, в которых была осуществлена замена.

Примеры:

s/to/by/w changes - Заменить в тексте первое вхождение "to" в каждой строке, если таковое есть, на"by" и измененные строки сохранить в файле "changes" .

/iiii/s/[Oo]lga/ Olga V.Galina/p - Заменить в тексте, в строках, где встречается вхождение "iiii" , первое вхождение подстроки "olga" или "Olga" на " Olga V.Galina" , при этом измененные строки выводить на печать.

s/[.,;:?]/*sign& *sign& **/g - Заменить в тексте каждое вхождение одного из знаков ".,;:?" в строку на "*sign& *" , где & будет тем знаком, который стоял прежде, например, "." на "*sign.*" , "?"на "*sign?*" и т. д.

Примеры:

1. Посчитать количество строк (input)

SED: $= (10.2 c.)

AWK: END { PRINT NR } (15.0 c.)

2. Напечатать все строки, содержащие "olga"

SED: /olga/p (11.6 c.)

AWK: /olga/ (25.6 c.)

 


 

Функція видалення d, друк p та вставки нових рядків a,c,i.

Стирання: d

Використання діапазонів буває плутаним, тому вам можливо доведеться зробити кілька експериментів під час випробовування нового сценарію. Корисною командою для цього є «d», яка вилучає кожний рядок, який збігається з обмеженням (або адресами). Якщо ви хочете подивитися на перші 10 рядків файла, то можете ввести

sed '11,$ d' file

що тотожно команді head. Якщо ви хочете відтяти заголовок електронного листа, що відповідає усьому аж до першого порожнього рядка, то введіть

sed '1,/^$/ d' file

Знаючи довжину файла, можна повторити дію команди tail. wc може порахувати рядки, a expr – відняти 10 від числа рядків. Сценарій оболонки Борна для виводу останніх 10-и рядків файла міг би виглядати так:

#!/bin/sh #print last 10 lines of file # First argument is the filename lines=`wc -l $1 | awk '{print $1}' ` start=`expr $lines - 10` sed "1,$start d" $1

Діапазон видалення може складатися з пари регулярних виразів для позначення початку і кінця операції. Або це може бути один регулярний вираз. Прибрати всі рядки, які починаються з «#» – легко:

sed '/^#/ d'

Усунення коментарів і порожніх рядків вимагає двох команд. Перша видаляє кожний символ від «#» до кінця рядка, а друга – усі порожні рядки:

sed -e 's/#.*//' -e '/^$/ d'

Третю слід додати, щоб прибрати всі пробіли і табуляцію перед самим кінцем рядка:

sed -e 's/#.*//' -e 's/[ ^I]*$//' -e '/^$/ d'

Символ «^I» – це CRTL-I або символ табуляції. Вам слід або безпосередньо ввести символ табуляції (CRTL-V а потім TAB на командному рядку, просто TAB, або CTRL-I, або CRTL-V а потім TAB в редакторі), або вказати його як «\t». Зверніть па порядок дій, який не є випадковим. Коментарі можуть починатися посеред рядка, маючи пробіли або табуляцію перед ними. Тому, спочатку видаляються коментарі, що може залишити пробілові знаки, які знаходяться перед коментарями. Друга команда прибирає всі хвостові пробіли і табуляцію, тож рядки, які містили тільки їх стають порожніми рядками. Остання команда усуває порожні рядки.

Останній приклад служить хорошою ілюстрацією простору дії шаблонів (або просто простору шаблону), який використовуєsed для оперування над рядком. Дійсними операціями sed є:

· Копіювання рядка вводу у простір дії шаблонів.

· Застосування першої команди sed до простору дії шаблонів, якщо обмеження адреси має істинне значення.

· Повторення тієї самої дії з другою командою, знову застосувавши її до (можливо вже зміненого першою командою) простору дії шаблонів.

· Виконання останньої команди, вивід простору дії шаблонів і зчитування наступного рядка файла вводу.

Наскільки я зрозумів, простір дії шаблонів (англійською просто pattern space) – це свого роду тимчасовий буфер, у якому зберігається зчитаний рядок вводу. Якщо адреса рядка не суперечить обмеженням, тоді виконується кожна команда по-черзі, змінюючи в процесі цей тимчасовий буфер. Далі з'явиться так званийбуфер зберігання (англійською hold space або hold buffer), який дозволяє зберегти модифікований рядок, знайдений у буфері простору дії шаблонів, з можливістю пізнішого його видобуття і копіювання в поточний /простір дії шаблонів/.

Треба перевірити, чи правильно я зрозумів. [В.Ц.]

Вивід: p

Іншою цінною командою є команда виводу: «p». Якщо sed не викликано з ключем «-n», тоді «p» подвоює вивід. Команда

sed 'p'

виводить двічі кожний рядок. Якщо ви хочете подвоїти кожний порожній рядок, то вкажіть

sed '/^$/ p'

Додання ключа «-n» скасовує вивід, доки ви явно не вкажете його. Іншим способом повторення функціональності програми head є - вивести тільки ті рядки, які ви хочете. Наступний приклад виводить перших 10 рядків

sed -n '1,10 p' file

sed може працювати як grep, якщо вказати оператор виводу для всіх рядків, які збігаються з регулярним виразом:

sed -n '/шаблон/ p'

що - тотожно

grep шаблон

Тут «p» названо оператором. Розібратися в термінології. Оператори, чи команди. [В.Ц.]

Інверсне обмеження: !

Іноді вам потрібно виконати дію над усіма рядками окрім тих, які збігаються з регулярним виразом, або над тими, які не входять у діапазон. Знак «!», який часто означає ні (заперечення) в знаряддях Юнікса, обертає зміст обмеження адрес на протилежний. Пам'ятаєте, що

sed -n '/шаблон/ p'

поводиться як команда grep? Ключ «-v» програми grep виводить усі рядки, які не містять збігу з шаблоном. В sed це можна здійснити за допомогою