Bir sınırlayıcı kullanılırken readarray tarafından eklenen yeni satır nasıl kaldırılır?


Yanıtlar:


13

Örtülü sondaki satır karakteri olan değil tarafından eklenen readarrayyerleşiğini, ama burada-string (tarafından <<<) ait bash, bakınız bir bash burada telli bir sondaki yeni satır kömürü eklese Neden? . Bunu kullanarak yeni satır kullanmadan dizeyi yazdırabilir ve printfbir işlem ikame tekniği üzerinden okuyabilirsiniz.< <()

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

şimdi doğru şekilde üretecekti

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

3
Vaov! Bunu asla bulamazdım. Teşekkürler
user1156544

4

Split + glob kullanabilirsiniz (liste bağlamında bir genişletmeyi sıralanmamış bıraktığınızda ne olur). Çoğu zaman yolumuza giriyor, aslında ihtiyacımız olduğunda kullanmamak utanç verici olurdu:

IFS=,
set -o noglob

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

Bu, geçici bir dosya yazmaktan daha az kıvrımlıdır ve daha sonra yaklaşımdaki readarraygibi readarray <<< "$string"çağrılır (ayrıca readarray -dçok yeni bir sürümüne ihtiyaç duyduğunu unutmayın bash).

Not rağmen o Siçinde IFS(açılımı ayırıcı ), aynı şekilde çalışır readarrayki a,,b,içine bölünmüş olup "a", ""ve "b"sadece.

Gerçek bir bölme operatörü için şunları kullanabilirsiniz zsh:

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

( @ve boş öğeleri korumak için çift tırnak).


readarray <<< "$string"Bir tempp dosyaya yazar ve ardından bellek kullanmak yerine siler?
user1156544

@ user1156544 Evet.
12'de mosvy

Bash'daki son komutunuza benzer bir şeyi nasıl yapabilirim? Ben bash 3.3 kullanıyorum ve eksikliğini telafi etmeye çalışıyorumreadarray -d
user1156544

3

@ StéphaneChazelas'ın cevabının hazır bir versiyonu:

# 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 -Gibi seçenekler yapacak set -f( noglobsadece değişken olarak çalışabilmesi için yerel).

declare -n a=$1Bir yaratacak yerel değişkeni atarafından adlandırılmış küresel değişkene bir takma ad olarak $1(işleve ilk argüman).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.