数値文字列で数値を変更する

数値文字列で数値を変更する

私は場所に応じて数字リストの数字を変更できる関数を書こうとしています。たとえば、リストの4番目の数字を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

関連情報