Задача вроде бы проста до безобразия (но, оказывается, она совсем не так проста, как того хотелось бы ): на входе имеем строку, содержащую специальные теги вида ..., указывающие на то, что кусок строки, заключённый между тегами, представлен в кодировке BASE64 (6-ти битная). Нужно: выделить текст между тегами и переконвертить его в кодировку текущей установленной локали.
Вроде бы всё должно быть элементарно, но у меня не получается реализовать это на BASH!
Вот мой вариант парсера, обрабатывающего файл, состоящий из строк, содержащих теги ...:
#!/bin/bash
slf="${0##*/}"
file_tblAccounts="$1"
cmdBase64='/usr/local/bin/base64'
[ -f "${file_tblAccounts}" ] || { echo "$slf: Error: file ${file_tblAccounts} does not exist" >&2; exit 1; }
while read line; do
if echo "$line" | fgrep -q ''; then
( echo "$line" | sed 's%%[NEWLINE]\n
\n&%g' | \
while read subline; do
{ echo "$subline" | grep -q '^' && \
echo "$subline" | sed -r 's%%%g' | $cmdBase64 -d; } || echo "$subline"
done ) | tr '\n' ' ' | sed 's%\[NEWLINE\]%%g; s%
%%g; s%$%\n%'
else
echo "$line"
fi
done <"${file_tblAccounts}"
Здесь подстрока, заключенная между тегами, перекодируется утилитой base64. Если пара тегов (открывающий/закрывающий) всего одна, то вроде бы всё правильно работает нормально, но если таких пар хотя бы две, начинаются перекосы...
Re: Простенькая задачка с ну очень нетривиальным решением? #1
Текст кода ломается форумом
Мой вариант
#!/bin/bash slf="${0##*/}" file_tblAccounts="$1" cmdBase64='/usr/local/bin/base64' [ -f "${file_tblAccounts}" ] || { echo "$slf: Error: file ${file_tblAccounts} does not exist" >&2 exit 1 } sed -r 's%%&\\n%g' ${file_tblAccounts} | while read line; do case "$line" in *'') echo -n "$line" | sed 's%%%' while read line; do case "$line" in *'') echo -n "$line" | sed 's%%%' break ;; *) echo "$line" ;; esac done | $cmdBase64 -d ;; *) echo "$line" ;; esac doneПоехали!
JID: konst.su [обезьяна] gmail.com
Простенькая задачка с ну очень нетривиальным решением? #2
>Текст кода ломается форумом
Да, есть такое дело. Отсутпы в коде вообще удаляются напрочь, а символы экранирования (обратный слэш) вырезаются, если их не продублировать. В общем, здесь определённо не следует пользоваться BB-тегом code, иначе и правда казусов/досадных недоразумений не избежать.
ks, спасибо за ответ, Вы меня сподвигли наконец на то, чтобы пересмотреть свой подход к разбору тегов. Хотя я и не стал использовать Ваш FSA-подобный (FSA- это конечный автомат
) способ разбора, ограничившись нижеследующим простеньким и неустойчивым к ошибкам (например, если для закрывающего тега нет открывающего) кодом, всё равно идея была правильная: ни к чему плодить новые сущности (за искл. добавления одного-единственного спец-тега , без которого пробельные разделители после переноса строки не сохраняются) нужны лишние теги и совершенно ни к чему обособлять 'ки переводами строк со всех сторон...
Итак, вот собственно окончательный вариант кода:
#!/bin/bash
file_tblAccounts="$1"
while read lnFROMfile; do
echo "$lnFROMfile" | \
sed -r 's%%\n%g; s%%\n%g' | \
while read line; do
{ echo "$line" | fgrep -q '' && \
{ echo -n "$line" | sed -r 's%$%%' | base64 -d; echo -n ''; }; } || \
echo -n "$line"
done | \
sed -r 's%%%g; s%%%g'
done <"${file_tblAccounts}"
Отлично работает, между прочим!
Эй, оператор-астроном,
Нет звёзд и звёздных глаз -
Есть плац, пивная, гастроном
И горы из колбас!
Марк Мерман, "Никто кино так не снимал, как Лени Риффеншталь"
Re: Простенькая задачка с ну очень нетривиальным решением? #3
Да ну вас
Если настроить IFS, то не нужен
Поехали!
JID: konst.su [обезьяна] gmail.com
Re: Простенькая задачка с ну очень нетривиальным решением? #4
Эй, оператор-астроном,
Нет звёзд и звёздных глаз -
Есть плац, пивная, гастроном
И горы из колбас!
Марк Мерман, "Никто кино так не снимал, как Лени Риффеншталь"