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

Ada*_*m L 3 bash shell-script text-processing variable

我正在尝试编写一个函数,让我根据位置更改数字列表中的数字。举例来说,我希望能够在列表中改变第四号10.90.123.80.4219让我得到10.90.123.19.42

我想要一些类似的东西:

NUMBERLIST=10.90.123.80.42
changeNumberByPosition "$NUMBERLIST" "4" "19"
echo $NUMBERLIST

10.90.123.19.42
Run Code Online (Sandbox Code Playgroud)

抱歉,如果这是一个简单的问题,但我对脚本编写还很陌生,我将不胜感激。

Jef*_*ler 5

使用 awk:

function changeNumberByPosition { 
  echo | string=$1 position=$2 newvalue=$3 \
    awk -v FS=. -v OFS=.  '{ 
      $0=ENVIRON["string"]; 
      $ENVIRON["position"]=ENVIRON["newvalue"]; 
      print;
   }';
}
Run Code Online (Sandbox Code Playgroud)

示例运行:

NUMBERLIST=10.90.123.80.42
new=$(changeNumberByPosition "$NUMBERLIST" 4 19)
echo "$new"
10.90.123.19.42
Run Code Online (Sandbox Code Playgroud)

或用新值更新现有值:

NUMBERLIST=10.90.123.80.42
NUMBERLIST=$(changeNumberByPosition "$NUMBERLIST" 4 19)
echo "$NUMBERLIST"
10.90.123.19.42
Run Code Online (Sandbox Code Playgroud)

使用 bash v4+:

function changeNumberByPosition ( 
  set -o noglob
  IFS=. 
  a=($1); 
  a[$2]=$3;
  printf '%s\n' "${a[*]}" 
)
Run Code Online (Sandbox Code Playgroud)

该函数的 bash-only 版本:

  1. a使用 IFS 根据句点将第一个参数(例如 $NUMBERLIST)拆分为一个数组。
  2. 用 中$2的值替换参数$3
  3. 打印数组的前 N-1 个元素,每个元素后跟一个句点,然后打印数组的最后一个元素。
  4. 它在一个子shell中完成所有这些,因此$a不会破坏现有环境。


Sté*_*las 5

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.
Run Code Online (Sandbox Code Playgroud)

您还可以使用以下方法手动进行拆分和加入:

NUMBERLIST=10.90.123.80.42
list=("${(@s:.:)NUMBERLIST}")
list[4]=19
NUMBERLIST=${(j:.:)list}
printf '%s\n' $NUMBERLIST
Run Code Online (Sandbox Code Playgroud)