Usando o awk:
function changeNumberByPosition {
echo | string=$1 position=$2 newvalue=$3 \
awk -v FS=. -v OFS=. '{
$0=ENVIRON["string"];
$ENVIRON["position"]=ENVIRON["newvalue"];
print;
}';
}
Execução da amostra:
NUMBERLIST=10.90.123.80.42
new=$(changeNumberByPosition "$NUMBERLIST" 4 19)
echo "$new"
10.90.123.19.42
ou para atualizar o valor existente com um novo valor:
NUMBERLIST=10.90.123.80.42
NUMBERLIST=$(changeNumberByPosition "$NUMBERLIST" 4 19)
echo "$NUMBERLIST"
10.90.123.19.42
Usando o bash v4 +:
function changeNumberByPosition (
set -o noglob
IFS=.
a=($1);
a[$2]=$3;
printf '%s\n' "${a[*]}"
)
A versão somente bash da função:
- divide o primeiro parâmetro (por exemplo, $ NUMBERLIST) em uma matriz
a
, com base em períodos, usando o IFS. - substitui o parâmetro
$2
pelo valor em$3
. - imprime os primeiros elementos N-1 da matriz, cada um seguido de um ponto e depois imprime o último elemento da matriz.
- faz tudo isso em um subshell, de modo que
$a
não atrapalha o ambiente existente.