更改一串数字中的一个数字

更改一串数字中的一个数字

我正在尝试编写一个函数,让我可以根据位置更改数字列表中的数字。例如,我希望能够将列表中的第四个数字更改为 ,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 版本:

  1. a使用 IFS 根据句点将第一个参数(例如 $NUMBERLIST)拆分为数组。
  2. 将参数替换$2为 中的值$3
  3. 打印数组的前 N-1 个元素,每个元素后跟一个句点,然后打印数组的最后一个元素。
  4. 它在子 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

相关内容