区切り文字を使用するときにreadarrayによって追加された新しい行を削除するにはどうすればよいですか?


9
VAR=a,b,c,d
# VAR=$(echo $VAR|tr -d '\n')
echo "[$VAR]"
readarray -td, ARR<<< "$VAR"
declare -p ARR

結果:

[a,b,c,d]
declare -a ARR=([0]="a" [1]="b" [2]="c" [3]=$'d\n')

readarray最後の改行を追加しないようにするにはどうすればよい\nですか?最新の$シンボルの意味は何ですか?


回答:


12

暗黙の末尾の改行文字はされないで追加されたreadarray組み込みが、ここでは、文字列(で<<<)のbash、参照bashはここで、文字列が末尾に改行文字を追加しないのはなぜ?。あなたは改行なしで文字列を印刷してそれを取り除きprintf、プロセス置換技術を介してそれを読むことができます< <()

readarray -td, ARR < <(printf '%s' "$VAR")
declare -p ARR

今は正しく生成されます

declare -a ARR=([0]="a" [1]="b" [2]="c" [3]="d")

3
うわー!私はこれを見つけたことはなかっただろう。ありがとう
user1156544

4

split + globを使用できます(リストコンテキストで展開を引用符で囲まないと、どうなりますか)。それはほとんどの場合私たちの邪魔をします、私たちが実際にそれを必要とするときにそれを使わないのは残念です:

IFS=,
set -o noglob

ARR=($VAR) # split+glob with glob disabled, and split using , as delimiter

これは、一時ファイルを作成readarrayしてからreadarray <<< "$string"アプローチのように呼び出すよりも少し複雑です(またreadarray -d、の最新バージョンが必要であることに注意してくださいbash)。

注意にもかかわらず、そのS中にIFS(を表したセパレータと同じように動作し)、readarrayその中には、a,,b,に分割され"a"""そして"b"のみ。

実際の分割演算子の場合は、zsh代わりに次を使用できます。

ARR=("${(@s:,:)VAR}")

@空の要素を保持するための二重引用符)。


readarray <<< "$string"temppファイルに書き込み、その後、メモリを使用するのではなく、それを削除しますか?
user1156544

@ user1156544はい。
モビー

どうすればbashの最後のコマンドに似たことができますか?私はbash 3.3を使用していて、不足を補おうとしていますreadarray -d
user1156544

3

@StéphaneChazelasの回答の缶詰バージョン:

# usage: setarray varname sep string
setarray(){ declare -n a=$1; local IFS=$2 -; set -f; a=($3); }

$ setarray arr , 1,2,3,
$ declare -p arr
declare -a arr=([0]="1" [1]="2" [2]="3")

$ setarray path : "$PATH"
$ setarray ld_preload ': ' "$LD_PRELOAD" # its elements can be separated by either ':' or spaces
...

local -以下のようなオプションになりますset -fnoglobちょうど変数として、関数にローカル)を。

declare -n a=$1作成するローカル変数をaで指定されたグローバル変数に別名として$1(関数の最初の引数)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.