Come rimuovere la nuova riga aggiunta da readarray quando si utilizza un delimitatore?


Risposte:


13

Il carattere implicito della nuova riga finale non viene aggiunto dal readarraybuiltin, ma dalla stringa qui ( <<<) di bash, vedi Perché una stringa qui bash aggiunge un carattere newline finale? . Puoi sbarazzartene stampando la stringa senza la nuova riga usando printfe leggendola con una tecnica di sostituzione del processo< <()

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

genererebbe correttamente ora

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

3
Wow! Non l'avrei mai trovato. Grazie
user1156544

4

È possibile utilizzare split + glob (cosa succede quando si lascia un'espansione non quotata nei contesti degli elenchi). Ci ostacola per la maggior parte del tempo, sarebbe un peccato non usarlo quando ne abbiamo davvero bisogno:

IFS=,
set -o noglob

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

È un po 'meno complicato rispetto alla scrittura di un file temporaneo e quindi lo chiama readarraycome readarray <<< "$string"nell'approccio (nota anche che ha readarray -dbisogno di una versione molto recente di bash).

Si noti che nonostante Sin IFS(che sta per separatore ), funziona nello stesso modo readarrayin cui a,,b,è diviso in "a", ""e "b"solo.

Per un vero operatore di divisione, è possibile utilizzare zshinvece:

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

(le @virgolette doppie per preservare gli elementi vuoti).


La readarray <<< "$string"scrive in un file tempp e poi lo cancella invece di utilizzare la memoria?
user1156544

@ user1156544 Sì.
mosvy,

Come posso fare qualcosa di simile al tuo ultimo comando in bash? Sto usando bash 3.3 e sto cercando di compensare la mancanza direadarray -d
user1156544,

3

Una versione fissa della risposta di @ 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
...

La local -farà opzioni come set -f( noglob) locale alla funzione, proprio come variabili.

La declare -n a=$1creerà un locale variabile acome alias per la variabile globale chiamata dal $1(il primo argomento della funzione).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.