Bash
更改一串數字中的一個數字
我正在嘗試編寫一個函式,讓我可以根據位置更改數字列表中的數字。例如,我希望能夠將列表中的第四個數字更改
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 版本:
a
使用 IFS 根據句點將第一個參數(例如 $NUMBERLIST)拆分為一個數組。- 用 中的值替換
$2
參數$3
。- 列印數組的前 N-1 個元素,每個元素後跟一個句點,然後列印數組的最後一個元素。
- 它在一個子外殼中完成所有這些,因此
$a
不會破壞現有環境。