добрый день
общая задача:
- получаем две строки
- "усекаем до общей минимальной базы"
- сравниваем
подробности:
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