отчеты по лабораторным работам / отчёт по заданию №4 — 3 / lab4
.docСанкт-Петербургский Государственный Институт Точной Механики и Оптики
(Государственный Университет)
Лабораторная работа №4
по курсу «Многопользовательские ОС»
Студенты: Иванов
Колпаков
Группа: 354
Преподаватель: Афанасьев Д.Б.
Санкт-Петербург
2001
-
Задание
Написать программу форматирования текста. Каждое предложение начинается с новой строки и первое слово предложения состоит из заглавных букв).
-
Решение
#!/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