Модераторы: powerfox, ZeeLax
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> скрипт bin/sh 
:(
    Опции темы
Katiuha
Дата 5.11.2008, 01:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 7.10.2007

Репутация: нет
Всего: нет



Можно ли написать скрипт используя только /bin/sh возможности, который в тексте перед каждым указаным словом(слово1) вставляет другое указаное слово(слово2)..  

Если можно образец кода, было бы мило ...
PM MAIL   Вверх
bilbobagginz
Дата 5.11.2008, 01:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 34
Всего: 317



а почему только возможностями /bin/sh ?
ведь есть для этого программки готовые (sed,awk,perl, и т.д.)

Добавлено через 5 минут и 50 секунд
если я правильно понял текст задачи, если был текст:

асд асдлкясд слово1 асл;кдасдлк

надо чтобы получился текст:
Цитата

асд асдлкясд слово2слово1 асл;кдасдлк

или
Цитата

асд асдлкясд слово2 слово1 асл;кдасдлк


?



--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
MAKCim
Дата 5.11.2008, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: нет
Всего: 207



Код

#!/bin/sh
SOURCE="test1"
ADDED="test2"
sed 's/\(\([ \t]\+\)'$SOURCE'[ \t]\+\)/\2'$ADDED'\1/g' input > output



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
MAKCim
Дата 5.11.2008, 09:51 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: нет
Всего: 207



Цитата(bilbobagginz @  5.11.2008,  01:56 Найти цитируемый пост)
а почему только возможностями /bin/sh ?

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


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Katiuha
Дата 5.11.2008, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 7.10.2007

Репутация: нет
Всего: нет



В этом и есть вся загвоздка что надо не используя (sed,awk,perl, и т.д.)

Цитата

Цитата

асд асдлкясд слово2слово1 асл;кдасдлк

или
Цитата

асд асдлкясд слово2 слово1 асл;кдасдлк


Разница толко в пробеле? Я думаю это не играет большой роли.. 
PM MAIL   Вверх
powerfox
Дата 5.11.2008, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 1
Всего: 97



Цитата(MAKCim @  5.11.2008,  10:51 Найти цитируемый пост)
что-то мне кажется, что используя только возможности интерпретатора, задачу не решить

Угу, так как даже вывод программы требует какой-либо утилиты.

Вариант попроще:
Код

#!/bin/sh

if [ $# -ne 2 ]
then
        echo "usage: `basename $0` arg1 arg2"
        exit 65
fi

echo "$2 $1"
exit 0






--------------------
user posted image
PM WWW   Вверх
inside_pointer
Дата 6.11.2008, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 9.3.2008

Репутация: нет
Всего: 12



t.sh
Код

#!/bin/bash
 
WORD="four";
INSERT="three"; 
 
(   # для изменения IFS только в пределах субшела
    IFS=$'\n'; 
    for LINE in $(cat file.txt); do
        LINE=${LINE//$WORD/$INSERT $WORD};
        echo "$LINE";
    done;
)
    
exit 0;


Код

[guest@localhost tmp]$ cat file.txt
one two four
one two four
four four
[guest@localhost tmp]$ ./t.sh
one two three four
one two three four
three four three four
[guest@localhost tmp]$


сейчас многие #!/bin/sh ссылаются на /bin/bash, в котором есть возможности которых не было в sh
это не полная отвязка от программ, т.к. файл нужно как-то вводить и подавать скрипту, но тут нет sed'a awk и perl
само задание предполагает ввод текста (потому я использовал cat), а echo - встроенная команда

Это сообщение отредактировал(а) inside_pointer - 6.11.2008, 10:37
PM MAIL   Вверх
Katiuha
Дата 8.11.2008, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 7.10.2007

Репутация: нет
Всего: нет



Цитата

#!/bin/sh
SOURCE="test1"
ADDED="test2"
sed 's/\(\([ \t]\+\)'$SOURCE'[ \t]\+\)/\2'$ADDED'\1/g' input > output


В этом варианте просто перепичатывает input, но слово не добавляет...

С bash'ом интересный вариант... но неужели нельзя сделать что-то похожее просто с sh..


Код

#!/bin/sh
file=text.txt
while read line
do
    echo "$line"
done < $file

Считывая таким образом нельзя вставить слово в считанную строку?

Это сообщение отредактировал(а) Katiuha - 8.11.2008, 01:07
PM MAIL   Вверх
inside_pointer
Дата 8.11.2008, 03:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 9.3.2008

Репутация: нет
Всего: 12



Код

#!/bin/sh

FILE=text.txt
WORD="four";
INSERT="three";

while read LINE
do
    for W in $LINE; do
        if test "$W" = "$WORD"; then
            echo -n "$INSERT $W ";
        else
            echo -n "$W ";
        fi;
    done;
    echo;
done < $FILE
 
exit 0;

test внутренняя команда, exit внутренняя, каждое слово в строке отделяется пробелом не табуляцией

тоже
Код

[guest@localhost tmp]$ cat text.txt
one two four
one two four
four four
[guest@localhost tmp]$ ./t.sh
one two three four
one two three four
three four three four
[guest@localhost tmp]$


минус - табуляция превращается в пробел
PM MAIL   Вверх
bilbobagginz
Дата 8.11.2008, 05:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 34
Всего: 317



Цитата(inside_pointer @  8.11.2008,  03:40 Найти цитируемый пост)
минус - табуляция превращается в пробел 

собственно единственный минус тут тому, кто домашние задачки не решает сам.
в csh есть встроенная поддержка построчной обработки ввода:
Код

#!/bin/csh
foreach l($<)
  тут делаем свои дела
end

Цитата(Katiuha @  8.11.2008,  01:05 Найти цитируемый пост)
В этом варианте просто перепичатывает input, но слово не добавляет...

потому что для работы с переменными команду sed дают в ковычках:
Код

#!/bin/sh
SOURCE="test1"
ADDED="test2"
sed -е "s/\(\([ \t]\+\)'$SOURCE'[ \t]\+\)/\2'$ADDED'\1/g" input > output

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



--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
inside_pointer
Дата 8.11.2008, 07:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 9.3.2008

Репутация: нет
Всего: 12



ещё минус к своему - двойные пробелы превращаются в один
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Linux/UNIX: Администрирование"
ZeeLax
Imple
nerezus
Этот форум предназначен для решения вопросов по администрации *n?x-систем, в частности по настройке сложных сетей и обслуживанию серверного оборудования.

  • Вы должны соблюдать правила форума.
  • Помните: какой вопрос, такой и ответ. Прежде чем задать вопрос прочитайте вот эту статью на форуме CIT.
  • Оскорблять запрещается.
  • Религиозные войны в Религиозных войнах.
  • Общение "просто так" в Клубе юнуксоидов. В отличие от многих других разделов, здесь разрешается сдержанно оффтопить и юморить в тему.

За интересные статьи, находки, решения, программы и просто реальную помощь будут ставиться + в репу).


В данный момент этот раздел модерируют nerezus, nickless, powerfox, pythonwin, Imple и ZeeLax. Если вы хотите помочь нам, пишите в ПМ и мы обсудим.


Спасибо. И use UNIX or die; С уважением, nerezus, nickless, powerfox, pythonwin, Imple, ZeeLax.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Администрирование *NIX систем | Следующая тема »


 




[ Время генерации скрипта: 0.0710 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.