скрипт по работе со строками

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
riptor2006
проходил мимо
Сообщения: 9
Зарегистрирован: 2008-06-01 21:38:30

скрипт по работе со строками

Непрочитанное сообщение riptor2006 » 2008-06-01 22:37:45

Нужна помошь по написанию програмы на shell под Unix по оброботке строки , которая выполняет действия:
вводит символьную строку;
во введенной строке ищет подстроку, передаваемую в качестве первого параметра;
вставляет после каждой найденной подстроки символ, передаваемый в качестве
второго параметра;
удаляет из полученной строки символ, передаваемый в качестве третьего
параметра;
выводит на экран введенную и новую строку.

проблема как я думаю кроется в участках кода где используется експр и цикл while

буду признателен тем кто поможет исправит существующий код или напишет свой

Код: Выделить всё

if test $# -lt 3
then

echo ОШИБКА  неправельное число параметров

exit
fi

orign_arg=$*
echo программа по поиску в ведёной строке другой подстроки введёной в качестве п                                  ервого параметра
echo "Введите исходную строку :"
read str1
###########
#for j in $(seq $('echo $str1|wc -w'))
#do
#tmp=$(echo $str1|cut -d " " -f$j)
#if[$tmp==$3]
#then
#tmp=" "
#fi
#out=$out$tmp
#out=$out
#done]
##########
echo Поиск
#  поиск
if echo $str1 | grep $1 > /dev/null
then
end='expr length $1'
#len=$1
#end=$(length (len))
#echo $end dlinna end
beg=1
#echo $beg
#echo начало цикла
while [ $1!='echo $str1 | cut -c $beg-$end' ]
do
#beg awk '/^'
#let beg=$beg+1
#let beg=$beg+1
##end='expr $beg + 1 '
beg=expr($beg + 1)
#echo telo zikla
#let end=$end+1
#let end=$end+1
echo $str1
echo $end
end=expr($end + 1)
done
echo Должна начаться вставка
#вставка
#let beg1=$beg-1
beg1='expr $beg-1'
j='echo $str1 | cut -c $beg1'
k='echo $j$2$k'
echo 'vstavka zaverhena'

else
echo "$1  нет в исходной подстроке"
exit
fi

if echo $k |grep $3 > /dev/null
then

#let end=lenght $3
end= 'expr lenght $3'
beg1=1
while [ $3!='echo $k | cut -c $beg - $beg' ]
do
#let beg=$beg+1
beg='expr $beg+1'
#let end=$end+1
end='expr $end+1'
done

echo идёт удаление
#удаление
#let beg1=$beg-1
beg1='expr $beg - 1'
#let end=$end+1
end= 'expr $end + 1'
j='echo $k | cut -c $beg1'
g='echo $k | cut -c $end'
echo $j$g

echo  исходная строка $str1
echo  ещё какаято $*
echo  result $a
echo  rezult $b
else

exit
fi
#cho the enter string  : $str1 $str2

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: скрипт по работе со строками

Непрочитанное сообщение zg » 2008-06-02 6:16:52

riptor2006 писал(а):Нужна помошь по написанию програмы на shell под Unix по оброботке строки , которая выполняет действия:
по-моему ты изобретаешь sed

дай пример вызова скрипта, который тебе надо получить, например

Код: Выделить всё

#./script.sh исходная_строка .. символ_замены .. и т.д.
Результат работы программы
подставь туда свои реальные значения, ну и результат каким он должен быть и почему

riptor2006
проходил мимо
Сообщения: 9
Зарегистрирован: 2008-06-01 21:38:30

Re: скрипт по работе со строками

Непрочитанное сообщение riptor2006 » 2008-06-02 9:11:19

вот что она делает на данный момент та программа котрую я написал

Код: Выделить всё

$ lab8
ОШИБКА неправельное число параметров
$ lab8 ddd fff gg
программа по поиску в ведёной строке другой подстроки введёной в качестве первого параметра
Введите исходную строку :
ffg sss
Поиск
ddd  нет в исходной подстроке
$ lab8 ddd fff gg
программа по поиску в ведёной строке другой подстроки введёной в качестве первого параметра
Введите исходную строку :
hhh ff kk sss ddd ggg fff ggg
Поиск
CPU time limit exceeded
а должна вот что

Код: Выделить всё

$ lab8 ddd fff gg
Введите исходную строку :
ffg sss aaa ddd  fff gg rr ggg
Поиск

исходная строка
ffg sss aaa ddd  fff gg rr ggg
результат
ffg sss aaa dddfff fff rr ggg
насчёт седа не очень понял он может всё точто я написал со строкой зделать или он позволяет работать со строкой типо пропустить слово удалить его из строки

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: скрипт по работе со строками

Непрочитанное сообщение zg » 2008-06-02 10:00:11

riptor2006 писал(а):насчёт седа не очень понял он может всё точто я написал со строкой зделать или он позволяет работать со строкой типо пропустить слово удалить его из строки
man sed
riptor2006 писал(а):$ lab8 ddd fff gg
ууу.. это ты на кого учишься? если это лаба, то выкладывай условие

riptor2006
проходил мимо
Сообщения: 9
Зарегистрирован: 2008-06-01 21:38:30

Re: скрипт по работе со строками

Непрочитанное сообщение riptor2006 » 2008-06-02 10:25:31

ман я в первую очередь почитал и руский и английский едиственное понял что он вроде работает со строками и файлами а как и что им можно делать нет

условие есть в первом посту наверху или имелось условие работы в том смысле мат возограждение можно обсудить ели будет работать
учусь я на электронщика я уже недёлю бьюсь над этой программой и не могу понять почему вылазят ошибки при не большом изменении что то вроде пробелов или вдругом случае она зацикливается и выдаёт ощибку дам где експр после цикла , что он незнает команду в кавычках

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: скрипт по работе со строками

Непрочитанное сообщение zg » 2008-06-02 11:27:02

Код: Выделить всё

zg# ./1.sh www .subdomain .ru
Введите строку: http://www.nic.ru
==============
Исходная строка: http://www.nic.ru
Строка для поиска: www
Строка после поиска: .subdomain
Строка для удаления: .ru
==============
Результат: http://www.subdomain.nic
zg#

Код: Выделить всё

zg# cat 1.sh
#!/bin/sh

if [ -z "$3" ]; then
    echo "Используйте данную программу следующим образом"
    echo "   $0 строка_для_поиска строка_после_поиска строка_для_удаления"
    exit 1
fi

# Читаем строку
echo -n "Введите строку: "
read SourceLine

# во введенной строке ищет подстроку, передаваемую 
# в качестве первого параметра

# вставляет после каждой найденной подстроки символ, 
# передаваемый в качестве второго параметра
ReplacedLine=`echo "$SourceLine"   | sed -E "s/$1/&$2/gI"`

# удаляет из полученной строки символ, передаваемый в качестве третьего 
# параметра
ReplacedLine=`echo "$ReplacedLine" | sed -E "s/$3//gI"`

echo "=============="
echo "Исходная строка: ${SourceLine}"
echo "Строка для поиска: $1"
echo "Строка после поиска: $2"
echo "Строка для удаления: $3"
echo "=============="
echo "Результат: ${ReplacedLine}"

zg#

riptor2006
проходил мимо
Сообщения: 9
Зарегистрирован: 2008-06-01 21:38:30

Re: скрипт по работе со строками

Непрочитанное сообщение riptor2006 » 2008-06-02 13:29:36

незнаю мож я что то делаю не так но вот

Код: Выделить всё

 laba8t www dog net
введите строку:httpwwwnet.ru
./laba8t: line 15: echo "$str1"  | sed -E "s/$1/&$2/gI": No such file or directory
./laba8t: line 18: echo "$out1"  | sed -E "s/$3//gI": No such file or directory
исходная строка httpwwwnet.ru
искомая строка:www
вставляемая строка:dog
удаляемая строка:net
Результат :

Код: Выделить всё

$ cat laba8t
#!/bin/sh

if [ -z "$3"  ]
then
echo "неверное количество параметров"
echo " $0 строка_поиска строка_ для_вставки_после_ искомой_ строки строка_для_удаления"
exit 1
fi
# чтение строки
echo -n "введите строку:"
read str1

#  поиск и вставка

out1= 'echo "$str1"  | sed -E "s/$1/&$2/gI"'

# Удаление
out1= 'echo "$out1"  | sed -E "s/$3//gI"'

echo "исходная строка $str1"
echo "искомая строка:$1 "
echo "вставляемая строка:$2"
echo "удаляемая строка:$3"
echo "Результат : $out1 "

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: скрипт по работе со строками

Непрочитанное сообщение zg » 2008-06-02 13:39:39

кавычки обратные, а не прямые, и пробелы убери, после знака равно

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: скрипт по работе со строками

Непрочитанное сообщение zg » 2008-06-02 13:47:39

=))) оффтоп: прально делаешь, что код правишь, преподы иногда очень сильно удивляются :lol: когда мой код видят

riptor2006
проходил мимо
Сообщения: 9
Зарегистрирован: 2008-06-01 21:38:30

Re: скрипт по работе со строками

Непрочитанное сообщение riptor2006 » 2008-06-02 14:00:29

насчёт кавычек не понял какие и где

Код: Выделить всё

out1= 'echo "$str1"  | sed -E "s/$1/&$2/gI"'

вданный момент прога имет такой результат

Код: Выделить всё

$ laba8t www dog net
введите строку:hfhfwwwghfhnetru
исходная строка hfhfwwwghfhnetru
искомая строка:www
вставляемая строка:dog
удаляемая строка:net
Результат : echo "$out1" | sed -e "s/$3//gI"
$ vi laba8t
#!/bin/sh

if [ -z "$3"  ]
then
echo "неверное количество параметров"
echo " $0 строка_поиска строка_ для_вставки_после_ искомой_ строки строка_для_удаления"
exit 1
fi
# чтение строки
echo -n "введите строку:"
read str1

#  поиск и вставка

out1='echo "$str1" | sed -e "s/$1/$2/gI"'

# Удаление
out1='echo "$out1" | sed -e "s/$3//gI"'

echo "исходная строка $str1"
echo "искомая строка:$1 "
echo "вставляемая строка:$2"
echo "удаляемая строка:$3"
echo "Результат : ${out1} "

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35411
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: скрипт по работе со строками

Непрочитанное сообщение Alex Keda » 2008-06-02 14:16:48

http://www.lissyara.su/?id=1075
почитай на досуге...
Убей их всех! Бог потом рассортирует...

riptor2006
проходил мимо
Сообщения: 9
Зарегистрирован: 2008-06-01 21:38:30

Re: скрипт по работе со строками

Непрочитанное сообщение riptor2006 » 2008-06-02 14:49:50

почетал а толку нефига не врубился как их ставить и куда
толиобратный слешь это обратная кавычка и нужно вместо ' поставить \ или вообще надо вместо ' использовать "
Использование кавычек
Имеется несколько символов, которые имеют в Shell специальное значение. Это <, >, *, ?, [ и ]. Чтобы отменить специальное значение этих символов, требуется заключать их особым образом в одинарные (') или двойные (") кавычки. То же действие в отношении одиночного символа выполняет обратная наклонная черта (\). (Обратные одинарные кавычки (`) используются только для командной подстановки в Shell и не отменяют специальных значений символов.)
Все символы, заключенные в одинарные кавычки, воспринимаются как обычные текстовые символы. Например, строка:
echostuff='echo $? $*; ls *| wc'




только присваивает переменной echostuff значение
echo $? $*; ls *| wc




но не вызывает выполнение ни одной из команд.
Внутри двойных кавычек специальное значение сохраняется только у некоторых символов - это $, \, ` и ". В результате внутри двойных кавычек имеет место подстановка значений переменных и команд. Однако, сами по себе двойные кавычки никак не влияют на подставляемые команды, и поэтому такие символы, как *, сохраняют свое специальное значение.
Чтобы отменить специальное значение символа $ и одинарных и двойных кавычек внутри двойных кавычек, перед ними требуется до полнительно указывать символ \. Вне двойных кавычек указание символа \ перед специальным символом адекватно заключению этого специального символа в одинарные кавычки. Символ \, стоящий перед символом новой строки, обозначает игнорирование этого символа. Благодаря этому можно продлевать командную строку.
Ниже приводятся несколько примеров использования кавычек:
Ввод Интерпретация
'`' обратная кавычка
'"' двойная кавычка
'`echo one`' одно слово '`echo one`
'\"' двойная кавычка
'`echo one`' слово one
'`' cинтаксическая ошибка
one two два слова one и two
'one two' одно слово 'one two'
'one two' одно слово 'one two'
'one * two' одно слово 'one * two'
'one * two' одно слово 'one * two'
`echo one` одно слово 'one'
вопрос по руководству что процетировано ещё есть что да как с бакслешом а впроге надо было кавычки те что на ё поставить вроде до этого менял не работал мож ещё что не было правильно

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: скрипт по работе со строками

Непрочитанное сообщение zg » 2008-06-02 17:51:46

riptor2006 писал(а):почетал а толку нефига
а как же ты накропал первый скрипт? он намного сложнее моего, или его не ты писал?

Аватара пользователя
f_andrey
майор
Сообщения: 2651
Зарегистрирован: 2007-12-26 1:22:58
Откуда: СПб
Контактная информация:

Re: скрипт по работе со строками

Непрочитанное сообщение f_andrey » 2008-06-02 18:54:06

zg писал(а):а как же ты накропал первый скрипт? он намного сложнее моего, или его не ты писал?
:) ну как первый раз, ты чего в институтах не учился, на 99% это шаблон который ходит годами но меняются мелочи или аналогичный вариант
Если ваша тема перенесена, то смотри http://forum.lissyara.su/viewtopic.php?f=1&t=32308

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: скрипт по работе со строками

Непрочитанное сообщение zg » 2008-06-02 20:56:31

f_andrey писал(а):ты чего в институтах не учился, на 99% это шаблон который ходит годами но меняются мелочи или аналогичный вариант
ааа.. :lol: ну тада дело гиблое )))

када я учился, то такую фигню никада не делал.. мне так верили :)

riptor2006
проходил мимо
Сообщения: 9
Зарегистрирован: 2008-06-01 21:38:30

Re: скрипт по работе со строками

Непрочитанное сообщение riptor2006 » 2008-06-02 23:50:20

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

но поди узнай об существовании трёх видов кавычек которые по разному ещё и работают а на лекциях внимание на этом не уделяли также как и sed-у
да кстати зачем опция i там ведь она нечего не меняет в отличие от g

Аватара пользователя
f_andrey
майор
Сообщения: 2651
Зарегистрирован: 2007-12-26 1:22:58
Откуда: СПб
Контактная информация:

Re: скрипт по работе со строками

Непрочитанное сообщение f_andrey » 2008-06-02 23:56:48

riptor2006 писал(а):так как изучал си++ и паскаль
я в таких случаях говорю проходил, это слово больше отражает суть процесса :)
Если ваша тема перенесена, то смотри http://forum.lissyara.su/viewtopic.php?f=1&t=32308

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: скрипт по работе со строками

Непрочитанное сообщение zg » 2008-06-03 7:22:25

riptor2006 писал(а):да кстати зачем опция i там ведь она нечего не меняет в отличие от g
в мануале по седу это всё расписано, если ты его читал, то не мог не заметить :wink:
riptor2006 писал(а):да первый скрипт писался по шаблону и по своей работе более понятен так как изучал си++ и паскаль аи вкакойто степени он похож на программы написаные на них
трабла в том, что шелл только связка для других, специализированных, приложений, поэтому что awk, что expr, что sed, ему пофигу. Если ты в своём скрипте используешь expr, то с тем же успехом можешь использовать и sed.

riptor2006
проходил мимо
Сообщения: 9
Зарегистрирован: 2008-06-01 21:38:30

Re: скрипт по работе со строками

Непрочитанное сообщение riptor2006 » 2008-06-03 11:06:39

f_andrey писал(а):
riptor2006 писал(а):так как изучал си++ и паскаль
я в таких случаях говорю проходил, это слово больше отражает суть процесса :)
да три года прохождения си наверно перерастает в изучал а вот сказать что я его знаю полностью не могу
zg писал(а):
riptor2006 писал(а):да кстати зачем опция i там ведь она нечего не меняет в отличие от g
в мануале по седу это всё расписано, если ты его читал, то не мог не заметить :wink:
riptor2006 писал(а):да первый скрипт писался по шаблону и по своей работе более понятен так как изучал си++ и паскаль аи вкакойто степени он похож на программы написаные на них
трабла в том, что шелл только связка для других, специализированных, приложений, поэтому что awk, что expr, что sed, ему пофигу. Если ты в своём скрипте используешь expr, то с тем же успехом можешь использовать и sed.
что можно совмещать другие скрипты и программы я знаю по аналогии с си и паскалем там есть различные библиотеки уже готовые а проблема в том что седа унас в курсе не было и в методическом материале тоже нет его


вот рабочий изменёный вариант так сказать

Код: Выделить всё

#!/bin/bash

if [ -z "$3"  ]
then
echo "неверное количество параметров"
#echo " $0 строка_поиска строка_ для_вставки_после_ искомой_ строки строка_для_удаления"
exit 1
fi
# чтение строки
echo -n "введите строку:"
read str1

#  поиск и вставка
if echo $str1 | grep $1 >/dev/null
then
out1=`echo "$str1" | sed -e "s/$1/&$2/gI"`
else
echo "$1 Net v ishodou podstroke"

fi
# Удаление

if echo $out1 | grep $3 >/dev/null
then
out1=`echo "$out1" | sed -e "s/$3//gI"`
else
echo "$3 Net v ishodnou podstroke"

fi

echo "исходная строка $str1"
echo "искомая строка:$1 "
echo "вставляемая строка:$2"
echo "удаляемая строка:$3"
echo "Результат : ${out1} "

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: скрипт по работе со строками

Непрочитанное сообщение zg » 2008-06-03 11:49:02

riptor2006 писал(а):роблема в том что седа унас в курсе не было и в методическом материале тоже нет его
зверский курс... как называется?

ну.. без методички трудно угадать... видишь ли, надо смотреть как подобные примеры вы учились решать, если ты уже баш юзаешь, то твою задачу можно в одну строчку запихать, только вот препод боюсь не оценит :)

в мане про баш почитай раздел про Parameter Expansion

riptor2006
проходил мимо
Сообщения: 9
Зарегистрирован: 2008-06-01 21:38:30

Re: скрипт по работе со строками

Непрочитанное сообщение riptor2006 » 2008-06-03 11:58:55

zg писал(а):
riptor2006 писал(а):роблема в том что седа унас в курсе не было и в методическом материале тоже нет его
зверский курс... как называется?

ну.. без методички трудно угадать... видишь ли, надо смотреть как подобные примеры вы учились решать, если ты уже баш юзаешь, то твою задачу можно в одну строчку запихать, только вот препод боюсь не оценит :)

в мане про баш почитай раздел про Parameter Expansion
курс называется как нистранно операционыесистемы
в принципе преподу достаточно и того варианта который уже есть