我正在尝试编写一个函数,让我可以根据位置更改数字列表中的数字。例如,我希望能够将列表中的第四个数字更改为 ,10.90.123.80.42
以便19
我得到10.90.123.19.42
。
我想要一些类似的东西:
NUMBERLIST=10.90.123.80.42
changeNumberByPosition "$NUMBERLIST" "4" "19"
echo $NUMBERLIST
10.90.123.19.42
抱歉,如果这是一个简单的问题,但我对脚本编写还很陌生,如果我能得到任何帮助,我将不胜感激。
答案1
使用 awk:
function changeNumberByPosition {
echo | string=$1 position=$2 newvalue=$3 \
awk -v FS=. -v OFS=. '{
$0=ENVIRON["string"];
$ENVIRON["position"]=ENVIRON["newvalue"];
print;
}';
}
示例运行:
NUMBERLIST=10.90.123.80.42
new=$(changeNumberByPosition "$NUMBERLIST" 4 19)
echo "$new"
10.90.123.19.42
或用新值更新现有值:
NUMBERLIST=10.90.123.80.42
NUMBERLIST=$(changeNumberByPosition "$NUMBERLIST" 4 19)
echo "$NUMBERLIST"
10.90.123.19.42
使用 bash v4+:
function changeNumberByPosition (
set -o noglob
IFS=.
a=($1);
a[$2]=$3;
printf '%s\n' "${a[*]}"
)
该函数的仅 bash 版本:
a
使用 IFS 根据句点将第一个参数(例如 $NUMBERLIST)拆分为数组。- 将参数替换
$2
为 中的值$3
。 - 打印数组的前 N-1 个元素,每个元素后跟一个句点,然后打印数组的最后一个元素。
- 它在子 shell 中完成所有这些操作,因此
$a
不会破坏现有环境。
答案2
和zsh
:
NUMBERLIST=10.90.123.80.42
typeset -T NUMBERLIST numberlist . # tie $NUMBERLIST variable to $numberlist array
# in a similar fashion as $PATH is tied to
# $path, but here using "." instead of ":" as
# the separator
numberlist[4]=19
printf '%s\n' $NUMBERLIST # with updated 4th field.
您还可以使用以下命令手动进行拆分和合并:
NUMBERLIST=10.90.123.80.42
list=("${(@s:.:)NUMBERLIST}")
list[4]=19
NUMBERLIST=${(j:.:)list}
printf '%s\n' $NUMBERLIST