# Надо из
aaa-bbb-ccc=aaa-bbb-ccc
# получить
aaa_bbb_ccc=aaa-bbb-ccc
Уточнение: надо чтобы работало для произвольных строк и меняло '-' (и другие символы, недопустимые в именах переменных bash) на '_', но только перед знаком '='
Теперь бенчмарк надо пилить, раз уж сишечка вошла в тред
Так не вопрос)
C:
$ /usr/bin/time sh -c 'for i in $(seq 1 10000);do echo "aaa-aaa-bbb-ccc.ddd=aaa-aaa.ddd" | ./test > /dev/null
; done'
26,11 real 10,64 user 20,72 sys
sed:
$ /usr/bin/time sh -c 'for i in $(seq 1 10000);do echo "aaa-aaa-bbb-ccc.ddd=aaa-aaa.ddd" | sed "h;s/.*=//;x;s/=.
*//;s/-/_/g;G;s/\n/=/" > /dev/null ; done'
39,77 real 16,55 user 29,78 sys
perl:
$ /usr/bin/time sh -c 'for i in $(seq 1 10000);do echo "aaa-aaa-bbb-ccc.ddd=aaa-aaa.ddd" | perl -p -e "s/(?<!\=.{0,254})[-.]/_/g" > /dev/null ; done'
46,93 real 24,43 user 26,71 sys
var='aaa-bbb-ccc.ddd&eee$fff=111-222-333=444.555&777$888'
IFS== read -a array <<< $var
array[0]=${array[0]//-/_}
for i in ${array[@]}; do
delimiter=${result:+=}
result=${result}${delimiter}${i}
done
echo $result