Bash:弦楽をトリオと四重奏に分ける

Bash:弦楽をトリオと四重奏に分ける

LSB区切り文字なしで連続した文字列を3つの文字グループに分割しMsbて配列に保存する方法は?

たとえば、次のようbcdefghijhkになります。

bc def ghi jhk   
b cdef fghi ijhk  

純粋なbash文字列操作を使用してください。たとえば、順序を維持する必要があるため、文字列を反転することはオプションではありません。三重項jhkはkhjにはできません。

ベストアンサー1

以下は、あなたが要求した方法で文字列を分割する方法を見つけたものです。私はこれをBashサブルーチン(関数とも呼ばれる)で書いています。なぜなら、次のように自分のスクリプトに統合できるような気がしたからです。

#!/usr/bin/env bash

number=bcdefghijhk
chunk=2

number_parts=()  # global variable

function slice_number {
  local num="$1"
  local chk="$2"

  local len=${#num}
  local pos=0
  local chk_first=$(( len % chk ))

  # the first chunk is smaller when the number length
  # is not an exact multiple of chunk-size
  if [[ $chk_first -gt 0 ]]; then
    number_parts[${#number_parts[@]}]="${num:$pos:$chk_first}"
    pos=$(( pos + chk_first ))
  fi

  # collect the rest of the number as full-size chunks
  while (( (pos + chk) <= len )); do
    number_parts[${#number_parts[@]}]="${num:$pos:$chk}"
    pos=$(( pos + chk ))
  done
}

# call the slicing routine
slice_number "${number}" ${chunk}

# now $number_parts[] has the sliced up number
printf '%s ' "${number_parts[@]}"
echo

MSBとLSBがあると説明したので、文字列を「数値」と呼びますが、これは文字列として機能します。私はあなたが要求したグループ(3または4)のサイズを「チャンク」サイズと呼びます。

文字列の一番右の端はフルサイズのブロックでなければならず、一番左の端は部分的なブロックでなければならないので、最初は非常に難しいようです。ほとんどの文字列の解析はその逆を望んでいます。その後、合計文字列の長さをブロックサイズでモジュールとして計算すると、最初の(最も左の)ブロックの長さが短くなり、残りのブロックは正確にブロックサイズになることに気づきました。最初のチャンクは特別なケースであり、残りは文字列を介して次のスライスの開始位置を前進させる単純なループです。

このルーチンは、配列のゼロ(最初)要素が文字列の左端のチャンクを保持し、配列の最後の要素が右端のチャンクを保持する配列にチャンクを格納します。私のスクリプトの最後の行は、ユーザーが指定した出力タイプであるスペース区切り文字(末尾に末尾のスペースがある)を使用してブロックを印刷する例を示しています。配列の代わりに文字列を組み立てるようにコードを変更できます。

配列は私が頻繁に使用しますが、他では一般的ではない技術で満たされています。 0 から始まる配列では、配列要素の数は正確に配列の末尾の次の要素のインデックスです。つまり、新しい要素を配列の末尾に「プッシュ」すると、対応するインデックスが埋められます。配列の割り当ては複雑に見えますが、うまくいきます。

最後に、この例のサブルーチンは、指定された文字列またはブロックサイズパラメータに対してチェックを行いません。チャンクサイズが0、負、または数字以外の文字がある場合は、いくつかの処理が必要です。チャンクサイズが文字列の長さ以上の場合、サブルーチンは特別なアクションを取る必要があります。文字列が空の場合は処理する必要があります。

おすすめ記事