나는 위치에 따라 숫자 목록의 숫자를 변경할 수 있는 함수를 작성하려고 합니다. 예를 들어, 목록의 네 번째 숫자를 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 전용 버전:
a
IFS를 사용하여 첫 번째 인수(예: $NUMBERLIST)를 마침표를 기준으로 한 배열로 분할합니다.$2
매개변수를 의 값으로 바꿉니다$3
.- 배열의 처음 N-1개 요소를 인쇄하고 각 요소 뒤에 마침표를 붙인 다음 배열의 마지막 요소를 인쇄합니다.
- 이 모든 작업은 서브셸에서 수행되므로
$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