ЗАНЯТИЕ N2

Цель занятия

Изучить потоковый редактор sed и используемый в нем диалект регулярных выражений.

Краткая информация о редакторе sed

Редактор sed относится к текстовым редакторам потокового типа и не является интерактивным. Он предназначен для обработки текстовых данных, поступающих из файла или стандартного входного потока и выдачи результата в стандартный поток вывода. При этом редактор последовательно извлекает строки текста из файла или стандартного входного потока и копирует их в буфер редактирования, затем применяет команды для заданных строк. Таким образом содержимое файла не затрагивается. По умолчанию редактор sed записывает каждую входную строку в стандартный выходной поток. Чтобы запретить отображение каждой входной строки, служит опция -n.

Процесс, созданный для выполнения редактора sed, возвращает 0, если не найдены синтаксические ошибки, в случае обнаружения последних возвращается ненулевое значение. Команды редактирования могут быть указаны как в командной строке, так и в отдельном файле-программе. Редактор sed не изменяет исходных данных. Для сохранения изменений можно направить выходной поток в файл.

Для ограничения диапазона обрабатываемых данных может использоваться цифровая, контекстная (по регулярному выражению) или смешанная адресация строк. Без указания диапазона редактор sed обрабатывает все строки потока ввода или файла. При использование цифровой адресации цифра указывает на номер строки. Знак доллара $ может использоваться для адресации последней строки во входном потоке или в файле. Диапазон строк указывается номерами строк через запятую и включает в себя все указанные строки.

Редактор sed распознает следующие метасимволы регулярных выражений:

^ $ . * [ ] [^] \( \) \< \> \{n\} \{n,\} \{,m\} \{n,m\} &

Метасимвол & в команде s используется в строке замены для подстановки значения, которое соответствует регулярному выражению шаблона поиска.

Общий синтаксис вызова команд редактора sed следующий:

sed [-n] [-e script]... [-f script_filename]... [filename...]

где

script - программа на языке sed;

script_filename - файл с программой на языке sed;

filename - имя файла, в котором осуществляется поиск.

Примеры использования команды:

sed -n '/regexp/p' filename (sed 's/regexp/repstr/' filename)

или

cat filename | sed -n '/regexp/p'

или

echo $varname | sed 's/regexp/repstr/'

где

regexp - регулярное выражение (шаблон поиска);

repstr - строка, замещаемая найденное выражение;

/ - символ-разделитель между командами редактора sed, regexp и repstr;

filename - имя файла, в котором осуществляется поиск;

varname - имя переменной, в значении которой осуществляется поиск.

Символ-разделитель / можно заменить на любой другой символ, поставив перед ним обратную наклонную черту - \, например:

sed -n '\cREcp' filename

Полный синтаксис и подробное описание редактора sed можно получить выполнив команду man sed.

Краткая информация о метасимволах регулярных выражений редактора sed

^ якорный символ привязки регулярного выражения к началу строки

$ якорный символ привязки регулярного выражения к концу строки

. соответствует одному любому символу

* соответствует нулевому и более количеству повторений символа

[] соответствует одному из перечисленных в скобках символу

[^] соответствует одному из НЕ перечисленных в скобках символу

\< якорный символ привязки регулярного выражения к началу слова

\> якорный символ привязки регулярного выражения к концу слова

\(\) запоминающие скобки

& запоминает всю найденную строку

x\{m,n\} интервал повторения символа (m - минимум, n - максимум)

Полный синтаксис и подробное описание применения регулярных выражений можно получить выполнив команду man regexp и man regex.

Краткая информация о командах редактора sed

a\ добавляет одну или более строк текста к текущей строке

c\ заменяет текст в текущей строке

d удаляет строки

i\ вставляет текст перед текущей строкой

h копирует содержимое буфера редактирования в буфер хранения

H добавляет содержимое буфера редактирования в буфер хранения

g копирует содержимое буфера хранения в буфер редактирования

G добавляет содержимое буфера хранения в буфер редактирования

l вывод непечатных символов

p вывод строк

n читает следующую строку и применяет к ней следующую команду

q выход из редактора sed

r чтение строк из указанного файла

! все строки, не соответствующие указанному диапазону

s подстановка указанной строки вместо искомого текста

Флаги команды постановки

g подстановка вместо каждого искомого вхождения в строке

p вывод строк

w вывод строк в указанный файл

x поменять местами содержимое буферов хранения и редактирования

y трансляция символов (не допускает использования метасимволов)

При множественном применении команд или вложенной адресации диапазонов их группирование осуществляется с помощью фигурных скобок {}. При этом каждая команда должна находиться в отдельной строке, либо заканчиваться символом ; (точка с запятой).

Порядок проведения занятия

1. Прочитать методические материалы по использованию редактора sed, находящиеся по адресу http://cs.ifmo.ru/education/documentation/sed.

2. Выполнить упражнения с готовыми примерами использования регулярных выражений, объяснить результаты их выполнения и ответить на сопровождаемые их вопросы.

3. Составить регулярные выражения для заданий на самостоятельную работу - лабораторная работа N2. Проверить их правильность используя команду sed. Оформить отчет и защитить его в начале следующего занятия, ответив на контрольные вопросы преподавателя.

Примеры использования регулярных выражений

В примерах используются системные файлы passwd и group, находящиеся в каталоге /etc, файлы с данными, находящимися в каталоге /home/ad/re1 на сервере helios, а также данные из сетевой базы пользователей (NIS+), которые можно получить командой niscat, например:

niscat passwd.org_dir

niscat group.org_dir

niscat hosts.org_dir



Упражнения на использование редактора sed

sed '/north/p' datafile

sed -n '/north/p' datafile

sed '3d' datafile

sed '3,$d' datafile

sed '$d' datafile

sed '/north/d' datafile

sed 's/west/north/g' datafile

sed -n 's/^west/north/p' datafile

sed 's/[0-9][0-9]$/&.5/' datafile

sed -n 's/Hemenway/Jones/gp' datafile

sed -n 's/\(Mar\)got/\1ianne/p' datafile

sed 's#3#88#g' datafile

sed -n '/west/,/east/p' datafile

sed -n '5,/^northeast/p' datafile

sed '/west/,/east/s/$/**VACA**/' datafile

sed -e '1,3d' -e 's/Hemenway/Jones/' datafile

sed '/Suan/r newfile' datafile

sed -n '/north/w newfile' datafile



sed '/^north /a\

--->THE NORTH SALES DISTRICT HAS MOVED<---' datafile



sed '/eastern/i\

NEW ENGLAND REGION\

-------------------------------------' datafile



sed '/eastern/c\

THE EASTERN REGION HAS BEEN TEMPORARILY CLOSED' datafile



sed '/eastern/{ n; s/AM/Archie/; }' datafile

sed '1,3y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' datafile

sed '5q' datafile

sed '/Lewis/{ s/Lewis/Joseph/;q; }' datafile

sed -e '/northeast/h' -e '$G' datafile

sed -e '/WE/{h; d; }' -e '/CT/{G; }' datafile

sed -e '/northeast/h' -e '$g' datafile

sed -e '/WE/{h; d; }' -e '/CT/{g; }' datafile

sed -e '/Patricia/h' -e '/Margot/x' datafile



Упражнения по программированию на языке редактора sed



# Содержимое файла-программы sedding1:

/Lewis/a\

Lewis is the TOP Salesperson for April!!\

Lewis is moving to the southern district next month.\

CONGRATULATIONS!

/Margot/c\

*******************\

MARGOT HAS RETIRED\

********************

1i\

EMPLOYEE DATABASE\

---------------------

$d

# end of script sedding1



# Содержимое файла-программы sedding2:

/western/, /southeast/{

/^ *$/d

/Suan/{ h; d; }

}

/Ann/g

s/TB \(Savage\)/Thomas \1/

# end of script sedding1



Проанализируйте тексты программ и объясните назначение каждой строки программы; наберите и выполните их; проанализируйте результат.



Лабораторная работа N2

Задания для самостоятельной работы ориентированы на использование файла данных /home/ad/re1/datebook.

1. Замените имя Jon на Jonathan.

2. Удалите первые три строки.

3. Выведите строки с 5-ой по 10-ю.

4. Удалите строки, содержащие Lane.

5. Вывести все строки с с днем рождения в ноябре или декабре.

6. Добавить три символа * в конец строк, начинающихся с Fred.

7. Замените строку, содержащую Jose на JOSE HAS RETIRED.

8. Замените дату рождения Popeye на 11/14/46. При этом подразумевается, что вы не знаете значение даты, хранящейся в файле. Составьте и используйте регулярное выражение для ее поиска.

9. Удалите все пустые строки.

10. Напишите программу на языке редактора sed, которая:

a. вставляет перед первой строкой заголовок TITLE OF FILE.

b. удаляет последнее поле, значение которого кратно 500.

c. меняет местами имя и фамилию.

d. добавляет к концу каждой строки фразу THE END.



Примеры контрольных вопросов

Объяснить состав регулярного выражения и описать результаты вывода каждой из приведенных ниже команд:

sed -n '/sentimental/p' file

sed '1,3d' file > newfile

sed '/[Dd]aniel/d' file

sed -n '15,20p' file

sed '1,10s/Montana/MT/g' file

sed '/March/!d' file

sed '/report/s/5/8/' file

sed 's/....//' file

sed 's/...$//' file

sed '/east/,/west/s/North/South/' file

sed -n '/Time off/w timefile' file

sed 's/\([Oo]ccur\)ence/\1rence/' file

sed -n 'l' file

Пример ответа на контрольный вопрос: Команда sed -n '/sentimental/p' file выводит все строки, содержащие sentimental. Содержимое файла При file при этом не изменяется. Без ключевого символа -n строки, содержащие sentimental, будут выведены дважды.