Удержание и модифицирование потока 1 (Нужен небольшой совет)

Модератор: Модераторы разделов

_YT_
Сообщения: 239
ОС: Gentoo Linux ~amd64

Удержание и модифицирование потока 1

Сообщение _YT_ »

Привет всем!

Написал небольшой скриптик, но хочется его улучшить.
Есть шаблон *.html, надо все переменные задать правило там.

replacement(){
sed s/<что-то1>/<что-то другое1>/g \
| sed s/<что-то2>/<что-то другое2>/g \
| sed s/<что-то3>/<что-то другое3>/g \
| sed s/<что-то4>/<что-то другое4>/g
}

changeForOnePart(){
replacement ${1} ${2} a ${3} \
| replacement ${1} ${2} b ${3} \
| replacement ${1} ${2} c ${3}

# и т.д. тут таких 20 штук replacement
}

cat template.html \
| changeForOnePart param1 param2 param 3 \
\
| changeForOnePart param1 param2 param 3 \
\
| changeForOnePart param1 param2 param 3 > result.html



Хочется упростить changeForOnePart, чтобы вызов был тот же, а внутри:

TEMPLATES="a b c d e f g ..." # например, т.е. список параметров каких-то

changeForOnePart(){
for i in ${TEMPLATES}
do
replacement ${1} ${2} ${i} ${3}
done
# ну или for i in ${TEMPLATES}; do replacement ${1} ${2} ${i} ${3} ; done
}

Главное, чтобы входной потом считывал данные, потом передавал далее, т.е. упростить код, но оставить все в рабочем виде.
При использовании for что-то не удается поток удержать, ошибки какие-то.

Если есть идеи, а я уверен, что у вас их полно, напишите как это написать правильно.

Заранее благодарю.
P.S. В bash написать :)
Спасибо сказали:
Nab
Сообщения: 257

Re: Удержание и модифицирование потока 1

Сообщение Nab »

Да уж не получиться так просто, ведь в Вашем случае в первом варианте, весь поток проходит через все функции замены.... потому как канал '|'. А во втором вы пытаетесь вызвать последовательно, вот поток и теряется, вам надо перенаправлять его в самое себя :) пока в цикле не окончатся элементы...

Я бы предложил сформировать строку выполнения из replacement() в этом цикле а уж потом полученный длинный канал применить к входящему потоку...

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

for i in ${TEMPLATES}; do
    RUN = "${RUN} | replacement ${1} ${2} ${i} ${3}"
done
${RUN}
Чтобы правильно задать вопрос, нужно знать больше половины ответа...
FREESCO in Ukraine
Спасибо сказали:
Nab
Сообщения: 257

Re: Удержание и модифицирование потока 1

Сообщение Nab »

И вот что еще я подумал
Учитывая мою борьбу с bash, я предлагаю в самой функции replacement() заменить кучу вызовов sed на один :

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

replacement(){
sed 's/<что-то1>/<что-то другое1>/g; \
    s/<что-то2>/<что-то другое2>/g; \
    s/<что-то3>/<что-то другое3>/g; \
    s/<что-то4>/<что-то другое4>/g'
}


Скорость возрастет в разы, подробности вот здесь:
Вопрос по bash-scripting
Чтобы правильно задать вопрос, нужно знать больше половины ответа...
FREESCO in Ukraine
Спасибо сказали:
_YT_
Сообщения: 239
ОС: Gentoo Linux ~amd64

Re: Удержание и модифицирование потока 1

Сообщение _YT_ »

Nab, спасибо попробую.

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

А как быстрее всего замены делать в больших файлах, когда надо много раз их открывать на чтение?
sed или awk, или perl, или python что из них лучше будет?

Заранее благодарю!
Спасибо сказали:
Nab
Сообщения: 257

Re: Удержание и модифицирование потока 1

Сообщение Nab »

_YT_ писал(а):
01.05.2006 11:20
А как быстрее всего замены делать в больших файлах, когда надо много раз их открывать на чтение?
sed или awk, или perl, или python что из них лучше будет?

Все зависит от рода операций которые вы будуте производить, но скорее всего наверно perl, он для этого спецом заточен, да и дополнительных инструментов у него намного больше... Кстати там есть и великолепные механизмы шаблонов и подстановок.
Вот один из лучших, как по мне, ресурсов на эту тему:
http://www.template-toolkit.ru/

Но есть и немного легче реализации...
Чтобы правильно задать вопрос, нужно знать больше половины ответа...
FREESCO in Ukraine
Спасибо сказали: