Санкт-Петербургский Государственный Институт Точной Механики и Оптики

(Государственный Университет)

Лабораторная работа №4

по курсу «Многопользовательские ОС»

Студенты: Иванов

Колпаков

Группа: 354

Преподаватель: Афанасьев Д.Б.

Санкт-Петербург

2001

  1. Задание

Написать программу форматирования текста. Каждое предложение начинается с новой строки и первое слово предложения состоит из заглавных букв).

  1. Решение

#!/bin/sh

#Если нас запустили без параметров, выводим ошибку и выходим

if test "$#" -eq 0

then

echo Usage: `basename $0` filename

exit

fi

file=$1

#Символами конца предложения считаем любое количество подряд идущих

#точек, восклицательных и вопросительных знаков

cat $file | tr '\n' ‘ ‘ | nawk '

function ProcessFirstWord(sentense)

{

#Удалим пробелы в начале строки

sub("^[ ]+","",sentense)

#Первое слово - большими буквами

#найдем первое слово (кончается или пробелом, или знаком пунктуации)

if (match(sentense,"[[:blank:]]")==0)

if (match(sentense,"[[:punct:]]")==0)

match(sentense,".$")

#получим это слово (file больше не нужна)

file=substr(sentense,1,RSTART)

ostatok=substr(sentense,RSTART+1,match(sentense,”.$”))

#все буквы в верхний регистр

file=toupper(file)

##заменим первое слово в исходной строке на полученное

#sub("^.{"RSTART"}",file,sentense)

#print sentense

printf(“%s%s\n”,file,ostatok)

}

{

str_rem=$0 #Кусок строки который остался после обработки

str_len=match(str_rem,".$")+1 #Длина строки+1 (для сравнения позиций)

do

{

#Получим вхождения точек и знаков

match_p=match(str_rem,"[.]+")

match_q=match(str_rem,"[?]+")

match_e=match(str_rem,"[!]+")

#Если все равны нулю (вхождений больше нет), покинем цикл

if (match_p==0 && match_q==0 && match_e==0)

break;

#Если что-нибудь равно нулю, заменим на длину строки

if (match_p==0)

match_p=str_len

if (match_q==0)

match_q=str_len

if (match_e==0)

match_e=str_len

#Начнем сравнение с целью выявления меньшей позиции

if (match_p<match_q && match_p<match_e)

match(str_rem,"[.]+"); #Вызываем match чтобы он установил RSTART,RLENGTH

else

if (match_q<match_e)

match(str_rem,"[?]+");

else

match(str_rem,"[!]+");

#Получим предложение

tstr=substr(str_rem,1,RSTART+RLENGTH-1)

#Удалим предложение из исходной строки

str_rem=substr(str_rem,RSTART+RLENGTH,match(str_rem,".$"))

ProcessFirstWord(tstr)

}

while (1)

ProcessFirstWord(str_rem)

}' > $file