숫자 문자열에서 숫자 변경

숫자 문자열에서 숫자 변경

나는 위치에 따라 숫자 목록의 숫자를 변경할 수 있는 함수를 작성하려고 합니다. 예를 들어, 목록의 네 번째 숫자를 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 전용 버전:

  1. aIFS를 사용하여 첫 번째 인수(예: $NUMBERLIST)를 마침표를 기준으로 한 배열로 분할합니다.
  2. $2매개변수를 의 값으로 바꿉니다 $3.
  3. 배열의 처음 N-1개 요소를 인쇄하고 각 요소 뒤에 마침표를 붙인 다음 배열의 마지막 요소를 인쇄합니다.
  4. 이 모든 작업은 서브셸에서 수행되므로 $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

관련 정보