LINUX.ORG.RU

bash, сравнение двух строк, с «внутренними» разделителями

 , ,


0

2

добрый день

общая задача:

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

подробности:

1. строки вида A.B.C

3."символ разделитель усечки" - "точка"

4.разрядность может быть разная, [1-3] числа/буквы
например:AAA.BB.C или A.BB.CCC

5. "урезка/приведение", пример
исходные строки:
A1.B1.C1 & A2.B2

после приведения (усекается первая строка):
A1.B1 & A2.B2

6. сравнение (тут все понятно)

p.s. набегом осилить не получилось сделать коротко, не «бахыт компот» :о)

простыми операциями, типа

NUM=AAA.BBB.CCC; echo ${NUM%.*} -> AAA.BBB
можно, конечно усекать, сравнивать длины, считать кол-во точек, но получается громоздко хотелось бы локоничный код, вопрос к гуру, возможно ли?

если есть идеи, выкладывайте код, рассмотрим

спасибо

p.s. с ананимусами общаюсь только при наличие КОДА

### UPDATE ###

в итоге есть несколько решений задачи, авторы cdslow & vodz

СПАСИБО ЗА ПОМОЩЬ

...

#!/usr/bin/bash
#
# https://www.linux.org.ru/forum/development/14648385?cid=14649819
# cdslow
#
# код обратно несовместимый, только на новых вер. bash-a
#
# FALSE:
# GNU bash, version 3.1.17(2)-release (i486-slackware-linux-gnu)
# GNU bash, version 4.2.45(2)-release (i486-slackware-linux-gnu)
#
# TRUE:
# GNU bash, version 4.3.46(1)-release (x86_64-slackware-linux-gnu)
#
set -e; clear

A="AA.BB.CC"
B="AA.BB.CC.DD"

IFS='.' read -r -a AS <<< $A
IFS='.' read -r -a BS <<< $B

(( N = ${#AS[@]} < ${#BS[@]} ? ${#AS[@]} : ${#BS[@]} ))

AJ=${AS[@]:0:$N}
BJ=${BS[@]:0:$N}

AN=${A:0:${#AJ}}
BN=${B:0:${#BJ}}

echo "
$A
$B
-->
$AN
$BN
"

[[ $AN == $BN ]] && echo MATCH || echo NO MATCH

...

#!/usr/bin/bash
#
# https://www.linux.org.ru/forum/development/14648385?cid=14649819
# cdslow
#
# код обратно совместимый
#
# GNU bash, version 3.1.17(2)-release (i486-slackware-linux-gnu)
# GNU bash, version 4.2.45(2)-release (i486-slackware-linux-gnu)
# GNU bash, version 4.3.46(1)-release (x86_64-slackware-linux-gnu)
#
set -e; clear

A="AA.BB.CC"
B="AA.BB.CC.DD"

IFS='.' read -r -a AW <<<$A
IFS='.' read -r -a BW <<<$B

read -r -a AS <<<${AW[@]}
read -r -a BS <<<${BW[@]}

(( N = ${#AS[@]} < ${#BS[@]} ? ${#AS[@]} : ${#BS[@]} ))

AJ=${AS[@]:0:$N}
BJ=${BS[@]:0:$N}

AN=${A:0:${#AJ}}
BN=${B:0:${#BJ}}

echo "
$A
$B
-->
$AN
$BN
"

[[ $AN == $BN ]] && echo MATCH || echo NO MATCH

...

#!/usr/bin/bash
#
# https://www.linux.org.ru/forum/development/14648385?cid=14649396
# vodz
#
set -e; clear

S1=AAA.BB.CCC
S2=AAA.BB

#///////////////////////////////////////////////////////////////////////////////
doteq()
#///////////////////////////////////////////////////////////////////////////////
{
local f1 fold=$- IFS=. s1=$1 s2=$2
set -f
eval "set -- \$$s1"
f1=$#
eval "set -- \$$s2"

if [ $# -lt $f1 ]; then
f1=$((f1-$#))
else
f1=$(($#-f1))
s1=$s2
fi

while [ $f1 -gt 0 ]; do
eval $s1='${'$s1'%.*}'
f1=$((f1-1))
done

[ "${fold#*f}" = "$fold" ] && set +f
}
#///////////////////////////////////////////////////////////////////////////////

echo "# before:
S1=$S1
S2=$S2
"
doteq S1 S2

echo "# after:
S1=$S1
S2=$S2"

...

#!/usr/bin/bash
#
# https://www.linux.org.ru/forum/development/14648385?cid=14649396
# vodz
#
set -e; clear

S1=AAA.BBB.CCC
S2=AAA.BBB

#///////////////////////////////////////////////////////////////////////////////
doteq()
#///////////////////////////////////////////////////////////////////////////////
{
local -i f1
local fold=$- IFS=. s1=$1 s2=$2
set -f
set -- ${!s1}
f1=$#
set -- ${!s2}

if [ $# -lt $f1 ]; then
f1=f1-$#
else
f1=$#-f1
s1=$s2
fi

while ((f1-->0)); do
eval $s1='${!s1%.*}'
done

[ "${fold#*f}" = "$fold" ] && set +f
}
#///////////////////////////////////////////////////////////////////////////////

echo "# before:
S1=$S1
S2=$S2
"
doteq S1 S2

echo "# after:
S1=$S1
S2=$S2"

...

#!/usr/bin/bash
#
# https://www.linux.org.ru/forum/development/14648385?cid=14651226
# cdslow/vodz mod 
#
set -e; clear

A="AAA.BBB. .*"
A="AAA.BBB.*"
A="AAA.BBB."
A="AAA.BBB"
B="AAA.BBB.CCC"

OLD_IFS=$IFS
IFS=.

read -ra AW <<< "$A"
read -ra BW <<< "$B"

AN=${#AW[@]}
BN=${#BW[@]}

if ((AN < BN)); then
BN="${BW[*]::AN}"
AN=$A
else
AN="${AW[*]::BN}"
BN=$B
fi

IFS=$OLD_IFS

echo "
$A
$B
-->
$AN
$BN
"

[[ $AN == "$BN" ]] && echo MATCH || echo NO MATCH
★★★

Ответ на: комментарий от anonymous

ща, погодь! я еще раз пять перечитаю, что-бы самому стало ясно :о)))

п.с. начни с общей картины

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

т.е. дословно :о))) получили две строки, их надо сравнить... фысе!

все-бы хорошо, но строки могут быть разные

первая строка AAA.BBB.CCC
вторая строка AAA.BBB

строки разные, а ихь надо сравнить :о)

а сравнивается следвующим методом:

- отсекается лишнее (приводим к одной "форме")
- потом сравниваем

пример

первая строка AAA.BBB.CCC
вторая строка AAA.BBB

усекаем, приводим к одной форме

первая строка AAA.BBB
вторая строка AAA.BBB

сравниваем - ура, строки «идентичные» (т.е. то, что надо!)

если бы были строки другие

первая строка AAA.CCC.BBB
вторая строка AAA.BBB

то строки были-бы «не идентичные» ...

надеюсь понятнее?

sunjob ★★★ ()
Последнее исправление: sunjob (всего исправлений: 1)
Ответ на: комментарий от sunjob

Я так понял ты ищешь определенное вхождение в обеих строках. Но при этом не поясняешь, по какому принципу это вхождение должно искаться. Т.е.

abcdtef
,,,,,ab
Минимальное общее вхождение - ab. Так тебе нужно? Тогда нужны критерии поиска вхождения. Какие символы, в каком порядке и т.д.

anonymous ()
Ответ на: комментарий от anonymous

ты ищешь определенное вхождение в обеих строках

нет, я строки сравниваю, только алгоритм «сравнения» нестандартный, пример сравнения я описал

sunjob ★★★ ()
Ответ на: комментарий от sunjob

Сравнивать строки значить от ^ до $. А ты сравниваешь часть строки, т.е. вхождение, судя по твоему примеру.

anonymous ()
Ответ на: комментарий от zolden

так я бы смог и сам :о)))

просто в «процессе работы со строками» их надо еще усекать, они в этом виде будут использоваться дальше, после сравнения... т.е

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


ну а так, да, можно было-бы [b]grep[/b]
sunjob ★★★ ()
Ответ на: комментарий от anonymous

нужно именно такой алгоритм «усечения» и «сравнения», кот. я описал

sunjob ★★★ ()
Последнее исправление: sunjob (всего исправлений: 1)
Ответ на: комментарий от sunjob

А не проще взять какой-нибудь Python где строку разбивать split'ом, разделить ведь у нас точка, и сравнивать получившиеся элементы списка?

hanharr ()
Ответ на: комментарий от sunjob

Ты так ничего и не объяснил нормально. Приводи реальные примеры с реальным необходимым результатом. Клещами из тебя вытягивать никому тут не надо. И используй, блин, теги по назначению.

anonymous ()
Ответ на: комментарий от sunjob

если бы были строки другие
первая строка AAA.CCC.BBB
вторая строка AAA.BBB
то строки были-бы «не идентичные» ...

Почему это? AAA и там и там одинаковые. Короче, очередное сформулированное кретином-педагогом задание. Не интересно.

legolegs ★★★★★ ()
Ответ на: комментарий от legolegs

проходите, проходите, не сталпливайтесь тутава!!! :о)

Почему это? AAA и там и там одинаковые

потому-что, после приведение к общей форме/размерности

первая строка AAA.CCC.BBB
вторая строка AAA.BBB

"приведение"

первая строка AAA.CCC
вторая строка AAA.BBB

скажете, что строки одинаковые?

AAA.CCC == AAA.BBB

sunjob ★★★ ()
Последнее исправление: sunjob (всего исправлений: 2)
Ответ на: комментарий от sunjob

В чем заключается это «приведение» можешь объяснить? Отрезание от первой строки последней части после точки включая точку? И так в каждой нечетной строке?

anonymous ()
Ответ на: комментарий от anonymous

«приведение» можешь объяснить?

могу, отчего хорошим людям не помочь :о)

Отрезание от первой строки последней части после точки включая точку?

бинго! да

И так в каждой нечетной строке?

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

на входе получаем две строки, «первую» и «вторую», далее их «сравниваем»

sunjob ★★★ ()
Последнее исправление: sunjob (всего исправлений: 1)
Ответ на: комментарий от sunjob

Строки в одном файле или в разных? Или это в пайпе? Сравнивать нужно строки с одинаковым индексом или каждая ко всем?

anonymous ()
Ответ на: комментарий от anonymous

они в виде переменных

для простоты, возьмем просто одну пару:

STR1="AAA.BBB"
STR2="AAA.BBB.CCC"

в этом контексте

для уточнения, СТРОКИ МОГУТ БЫТЬ РАЗНОЙ РАЗМЕРНОСТИ

STR1="AAA"
STR2="AAA.BBB.CCC"

STR1="AAA.BBB.CCC"
STR2="AAA"

sunjob ★★★ ()
Последнее исправление: sunjob (всего исправлений: 3)
Ответ на: комментарий от sunjob
vara="AA.BB.CC"
varb="AA.BB.CC.DD"
if grep -o "$vara" <<< "$varb"; then echo "совпадение"; else echo "несовпадение"; fi
AA.BB.CC
совпадение
anonymous ()
Ответ на: комментарий от sunjob

Ну если мы находим наименьшую строку длинной N из двух и сравниваем N символов то всё просто.

if [ ${#S1} -lt ${#S2} ] ; then N=${#S1}; else N=${#S2}; fi; echo $N
[ "${S1:0:$N}" == "${S2:0:$N}" ] && echo da || echo n

sed и точки тут не нужны.

legolegs ★★★★★ ()
Ответ на: комментарий от legolegs

все бы хорошо, но https://www.linux.org.ru/forum/development/14648385?cid=14648432 (комментарий)

СТРОКИ НУЖНЫ УСЕЧЕННЫМИ, ОНИ БУДУТ ЕЩЕ ДАЛЬШЕ ИСПОЛЬЗОВАТЬСЯ В ТАКОМ/УСЕЧЕННОМ ВИДЕ

точки тут не нужны

точки как раз нужны, это граница, по которой усекается строка, приводится к нужному виду, а потом сравнивается :о)

за старания всем спасибо, но пока все не то, точнее, «не совсем то»

sunjob ★★★ ()
Последнее исправление: sunjob (всего исправлений: 3)
Ответ на: комментарий от Einstok_Fair

строки общего вида вообще

для поростоты, на примере этого кода

...
STR1=AAA.BBB
STR2=AAA.BBB.CCC
...
STR1=AAA.BBB
STR2=AAA.BBB
...
STR1==STR2

sunjob ★★★ ()
Ответ на: комментарий от sunjob

отвечай «да» или «нет». Проблема не в том, что читатели не понимают, как отрезать, а в том, что не понимают - зачем так делать.

Einstok_Fair ★★☆ ()
Ответ на: комментарий от Einstok_Fair

зачем так делать

что-бы дальше работать с этими усеченными строками :о)

Проблема не в том, что читатели не понимают, как отрезать

вот вот... какие мымсли в этом направлении? поделитесь?

sunjob ★★★ ()
Последнее исправление: sunjob (всего исправлений: 1)
Ответ на: комментарий от anonymous

Сколько платишь?

сам догадаешься? лично ВАМ огромное спасибо, за потраченное время и упущенную выгоду :о)

удачки

sunjob ★★★ ()
Ответ на: комментарий от sunjob

СТРОКИ НУЖНЫ УСЕЧЕННЫМИ, ОНИ БУДУТ ЕЩЕ ДАЛЬШЕ ИСПОЛЬЗОВАТЬСЯ В ТАКОМ/УСЕЧЕННОМ ВИДЕ

Ты сам то понимаешь, что просишь? Твои, прости господи, усеченные строки это одна и та же строка в двух экземплярах, если совпадение найдено. Выше уже все написали с грепом. Это вхождение. Вхождение есть - бери строку. Вхождения нет, даже если там еще 100500 нелепых окончаний у строки, значит строка не нужна.

anonymous ()

Задание сформулировано нечётко. До какой длины усекать? В чём считаем эту длину: в символах или в словах, разделённых точками?

Если длина в байтах, то для каждой строки выполняем newstring=$(echo -n "$string" | head -c $n), где $string — исходная строка, $n — длина, до которой её надо урезать, newstring — переменная, в которую записывается новая урезанная строка. Если длина в словах, разделённых точками, то newstring=$(echo -n "$string" | cut -d. -f1-$n). Дальше просто сравниваем получившиеся 2 строки и работаем с ними.

aureliano15 ★★ ()
Ответ на: комментарий от aureliano15

в «процессе работы со строками» их надо еще усекать, они в этом виде будут использоваться дальше, после сравнения...

СТРОКИ НУЖНЫ УСЕЧЕННЫМИ, ОНИ БУДУТ ЕЩЕ ДАЛЬШЕ ИСПОЛЬЗОВАТЬСЯ В ТАКОМ/УСЕЧЕННОМ ВИДЕ

Отрезание от первой строки последней части после точки включая точку?

точки как раз нужны, это граница, по которой усекается строка, приводится к нужному виду, а потом сравнивается :о)

что-бы дальше работать с этими усеченными строками :о)

https://www.linux.org.ru/forum/development/14648385?cid=14648543 (комментарий)

понимаю, задача не простая, но

вопрос к гуру, возможно ли?

попробовал упростить до самого минимума, «псевдо-код» для баша, как еще обьяснить?

STR1=AAA.BBB; STR2=AAA.BBB.CCC

#
# 1. усечка, до общей базы/"размера"/размерности...
# теперь строки имеют значения:
#
STR1=AAA.BBB; STR2=AAA.BBB

# 
# 2. сравнение 
# 
if [ "$STR1" = "$STR2"]; then <blah-blah-blah>; fi

#
# 3. дальнейшие операции с уже усеченными строками
#

... $STR1 ...
... $STR2 ...

#
# the end
#

дак вот, меня интересует пунк 1

sunjob ★★★ ()
Последнее исправление: sunjob (всего исправлений: 2)
Ответ на: комментарий от sunjob

Мудак, если ты усечешь строки, у тебя получится одно и тоже. Нахрена тебе потом 2 строки? Значит и урезание никакое тебе не нужно. Тебе нужно вхождение. Пиздец долбоеб конченный.

anonymous ()
Ответ на: комментарий от anonymous

вы такой лапочка! попробуйте еще раз перед зеркалом, возможно у вас это получится?!

если ты усечешь строки, у тебя получится одно и тоже

да, а еще я в нее ем!

строки могут быть разными, я разве об этом не говорил?

STR1=BBB.CCC; STR2=AAA.BBB.CCC

#
# 1. усечка, до общей базы/"размера"/размерности...
# теперь строки имеют значения:
#
STR1=BBB.CCC; STR2=AAA.BBB

#
# сравниваем
#
BBB.CCC = AAA.BBB 
sunjob ★★★ ()
Ответ на: комментарий от sunjob

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

BBB.CCC = AAA.BBB
Тут нет вхождения, понимаешь?) Они не равны и они тебе не нужны. потому что... ТУТ НЕТ ВХОЖДЕНИЯ. Алло. Ты дико тупишь. Просто дичайше тупишь. Отдохно, поспи, потом посмотри, на то, что ты пишешь. Полюбому стыдно будет за тупость.

anonymous ()
Ответ на: комментарий от sunjob

в «процессе работы со строками» их надо еще усекать, они в этом виде будут использоваться дальше, после сравнения...

Ты мой пример запускал? Он как раз усекает.

СТРОКИ НУЖНЫ УСЕЧЕННЫМИ, ОНИ БУДУТ ЕЩЕ ДАЛЬШЕ ИСПОЛЬЗОВАТЬСЯ В ТАКОМ/УСЕЧЕННОМ ВИДЕ

Ради бога, используй. В чём проблема?

Отрезание от первой строки последней части после точки включая точку?

Отрезает.

точки как раз нужны, это граница, по которой усекается строка, приводится к нужному виду, а потом сравнивается :о)

Неотрезанные точки никуда не деваются.

что-бы дальше работать с этими усеченными строками :о)

Работай. В чём проблема?

aureliano15 ★★ ()
Ответ на: комментарий от anonymous

Я просто ору с тебя, чел.

эко как вас разкорячило :о)

Не знаю, в какой школе ты учишься, но это явно не школа для одаренных

да, два высших, явно не для ваших пониманий :о)

Тут нет вхождения, понимаешь?

чего мне тут и вдруг понимать? я где-то что-то утверждал про вхоЖдениЯ? это вы себе сами в голову вогнали... простите, эту мысль...

Они не равны и они тебе не нужны

таки да, они не равны, и таки нет - они мне нужны!

ТУТ НЕТ ВХОЖДЕНИЯ

мама, я с первого раза слышу!

Ты дико тупишь

скромно опускаю глаза, кланяюсь...

Просто дичайше тупишь

где то это уже было?!

Отдохно, поспи, потом посмотри

вот вот, ОТДОХНО, ПОСПО, и ПОСМОТРО... :о)

Полюбому стыдно будет

только на это и надеюсь

п.с.

если на этом ВАШИ скромные мысли закончились, давайте ... бай бай...

п.с.2

мне ни сколько не сложно читать ВАШИ опусы! зачем так изводить себя? мне ВАМ деньги перевести, что бы ВЫ не мучали себя? поберегите себя любимого для потомков, а то изшаркаетесь весь в инете...

ой бяда бяда... :о)

sunjob ★★★ ()
Последнее исправление: sunjob (всего исправлений: 2)
Ответ на: комментарий от aureliano15

до вашего поста «пока» не добрался, руками... ногами и глазами уже там, но руки еще не добрались...

спасибо, присмотрюсь внимательнее :о)

зы

$n — длина, до которой её надо урезать

как бы локонично/красиво получить это значение (понятно, что через if/then, сравнение длин можно это сделать...хотелось бы коротко)

и да, ОСОБЕННОСТЬ, усечение идет по точкам... :о) т.е. если в «строке» есть две «реперные точки», то и усекать можно два раза... по эти самые «точки» :о)

sunjob ★★★ ()
Последнее исправление: sunjob (всего исправлений: 3)

Вась, тебе сколько лет? Такое ощущение что 3летний ребенок пытается объяснить, что хочет мультики посмотреть.

anonymous ()
Ответ на: комментарий от aureliano15

ну да, про cut и урезку я в курсе спасиб, перевариваю :о)

STR=AAA.BBB.CCC
echo -n "$STR" | cut -d. -f1-1   # -> AAA
echo -n "$STR" | cut -d. -f1-2   # -> AAA.BBB
echo -n "$STR" | cut -d. -f1-3   # -> AAA.BBB.CCC

подходящий механизм, по длине урезки, просто считаем кол-во точек в строках, сравниваем, если что, режем, сравниваем ... бла бла бла

остальное доберусь до «дизеля», там поглядим, как эта хреновина будет соляру жрать :о)

sunjob ★★★ ()
Последнее исправление: sunjob (всего исправлений: 2)
Ответ на: комментарий от sunjob

ОНИ БУДУТ ЕЩЕ ДАЛЬШЕ ИСПОЛЬЗОВАТЬСЯ

Ну и используй. "${S1:0:$N}"

точки как раз нужны, это граница, по которой усекается строка, приводится к нужному виду

Покажи пример данных, по которому видна важность точек.

legolegs ★★★★★ ()
Ответ на: комментарий от sunjob

понятно, что через if/then, сравнение длин можно это сделать

Каких длин? Если нужна длина строки, то len=$(echo -n "$str" | wc -c).

хотелось бы коротко

Не совсем понятно, о чём речь. Сравнивать можно командой test, которая может быть условием if.

aureliano15 ★★ ()

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

annulen ★★★★★ ()
Последнее исправление: annulen (всего исправлений: 1)

Ну нате, без башизмов:

#!/bin/sh

S1=AAA.BB.CCC
S2="*.sh"

doteq() {
        local f1 fold=$- IFS=. s1=$1 s2=$2
        set -f
        eval "set -- \$$s1"
        f1=$#
        eval "set -- \$$s2"
        if [ $# -lt $f1 ]; then
                f1=$((f1-$#))
        else
                f1=$(($#-f1))
                s1=$s2
        fi
        while [ $f1 -gt 0 ]; do
                eval $s1='${'$s1'%.*}'
                f1=$((f1-1))
        done
        [ "${fold#*f}" = "$fold" ] && set +f
}

doteq S1 S2
echo "S1=$S1 S2=$S2"
С башизмами функция чуть короче:
doteq() {
        local -i f1
        local fold=$- IFS=. s1=$1 s2=$2
        set -f
        set -- ${!s1}
        f1=$#
        set -- ${!s2}
        if [ $# -lt $f1 ]; then
                f1=f1-$#
        else
                f1=$#-f1
                s1=$s2
        fi
        while ((f1-->0)); do
                eval $s1='${!s1%.*}'
        done
        [ "${fold#*f}" = "$fold" ] && set +f
}

vodz ★★★★★ ()
Последнее исправление: vodz (всего исправлений: 1)

Я такое на баше писать не стал бы. Но если попробовать, то получается как-то так:

#!/usr/bin/bash

A="AA.BB.CC"
B="AA.BB.CC.DD"

IFS='.' read -r -a AS <<< $A
IFS='.' read -r -a BS <<< $B

(( N = ${#AS[@]} < ${#BS[@]} ? ${#AS[@]} : ${#BS[@]} ))

AJ=${AS[@]:0:$N}
BJ=${BS[@]:0:$N}

AN=${A:0:${#AJ}}
BN=${B:0:${#BJ}}

echo $AN
echo $BN

[[ $AN == $BN ]] && echo MATCH || echo NO MATCH

cdslow ()
Ответ на: комментарий от cdslow

получается как-то так

да ... только получается «ни как» :о)

выхлоп вашего кода:

AA.BB.CC
AA.BB.CC.DD
NO MATCH

т.е строки, «не равны»

логика/механизм проверки следующий (попробую еще раз)

1. получаем строки
STR1=AA.BB.CC
STR2=AA.BB.CC.DD

2. строки не равнозначны :о) вторая "длиннее", подрезаем ее
STR1=AA.BB.CC
STR2=AA.BB.CC

3. сравниваем
STR1=STR2 -> строки "равны" (ну или эквивалентны, в более "широком" смысле нашей "узкой" задачи... :o) 

sunjob ★★★ ()
Ответ на: комментарий от vodz

to vodz

да, именно то, что надо! оба скрипта отрабатывают правильно! строки усекаются именно как «предполагается»! примерно это я и «имел ... в виду», что код будет запутанным и не маленьким :о) поэтому и обратился именно к знатокам.

!!! СПАСИБО !!!

sunjob ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.