次の変数のデータを動的配列として扱う際に問題があります。
variable_1='A|B|C|D' -> dynamic_array=(A B C D)
sedコマンドを使用して '|'を空白に置き換え、データをDynamic_arrayに渡す方法を試しました。
1行のコードでこれを行う方法はありますか?
答え1
変更する必要はありませんIFS
。バッシュ4.4からスタート:
readarray -td '|' arr < <(printf '%s' "$var")
$ var='A|B|C|D'
$ readarray -td '|' arr < <(printf '%s' "$var")
$ echo "${arr[0]}"; echo "${arr[3]}"
A
D
バラよりhelp readarray
説明する。
注:以前の提案(readarray -td '|' arr <<< "$var"
)は短いですが、Freddyが指摘したように、最後の配列要素に偽の改行文字を挿入します。
答え2
仮定bash
:
単語噴射を活用できます。内部フィールド区切り記号(IFS)のデフォルト値は、スペース、タブ、または改行です。ただし、環境変数を設定してそれをオーバーライドすることができ、その後IFS
一般的な方法を使用して変数を作成できます。
set -f # disable filename expansion
IFS='|' arr=($variable_1)
またはdeclare
:
IFS='|' declare -a 'arr=($variable_1)'
またはread
:
IFS='|' read -ra arr <<< "$variable_1"
このような変数を変更する場合は、IFS
まず別の変数に保存してからリセットする必要があります。
OLD_IFS="$IFS"
# my commands
IFS="$OLD_IFS"
答え3
仮定的に、要素に含まれるすべての文字または非文字に適用されるパラメータ拡張フラグをzsh
使用できます。s
$ string=$'first element|second\nbinary\x80element\0||second-last|'
$ array=("${(@s[|])string}")
$ typeset -p string array
typeset string=$'first element|second\nbinary\M-\C-@element\C-@||second-last|'
typeset -a array=( 'first element' $'second\nbinary\M-\C-@element\C-@' '' second-last '' )
空の文字列は空の要素(string=''
gets array=( '' )
、not array=( )
)に分割されます。