Ada*_*m L 3 bash shell-script text-processing variable
我正在尝试编写一个函数,让我根据位置更改数字列表中的数字。举例来说,我希望能够在列表中改变第四号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
Run Code Online (Sandbox Code Playgroud)
抱歉,如果这是一个简单的问题,但我对脚本编写还很陌生,我将不胜感激。
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)
function changeNumberByPosition (
set -o noglob
IFS=.
a=($1);
a[$2]=$3;
printf '%s\n' "${a[*]}"
)
Run Code Online (Sandbox Code Playgroud)
该函数的 bash-only 版本:
a
使用 IFS 根据句点将第一个参数(例如 $NUMBERLIST)拆分为一个数组。$2
的值替换参数$3
。$a
不会破坏现有环境。与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)