Bash

更改一串數字中的一個數字

  • May 8, 2017

我正在嘗試編寫一個函式,讓我可以根據位置更改數字列表中的數字。例如,我希望能夠將列表中的第四個數字更改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

對不起,如果這是一個簡單的問題,但我對腳本相當陌生,我能得到的任何幫助將不勝感激。

使用 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-only 版本:

  1. a使用 IFS 根據句點將第一個參數(例如 $NUMBERLIST)拆分為一個數組。
  2. 用 中的值替換$2參數$3
  3. 列印數組的前 N-1 個元素,每個元素後跟一個句點,然後列印數組的最後一個元素。
  4. 它在一個子外殼中完成所有這些,因此$a不會破壞現有環境。

引用自:https://unix.stackexchange.com/questions/363716