Saya ingin memecah 'hello'
menjadi h e l l o
dalam array hanya menggunakan bash, saya bisa melakukannya dengan sed 's/./& /g'
tetapi saya ingin tahu bagaimana membagi string ke dalam array di Bash ketika saya tidak tahu apa pembatas akan menjadi, atau pembatas adalah karakter tunggal. Saya tidak berpikir saya dapat menggunakan ${i// /}
tanpa kreativitas karena pembatas adalah tidak diketahui, dan saya tidak berpikir bahwa ekspresi menerima regex. Saya mencoba menggunakan BASH_REMATCH dengan [[string = ~ ([az].). *]] Tetapi tidak berfungsi seperti yang saya harapkan. Apa cara yang tepat untuk menggunakan hanya bash untuk mencapai string.split()
jenis perilaku? Alasannya adalah bahwa saya mencoba untuk menulis utilitas rev di semua bash:
while read data; do
word=($(echo $data|tr ' ' '_'|sed 's/./& /g'))
new=()
i=$((${#word[@]} - 1))
while [[ $i -ge 0 ]]; do
new+=(${word[$i]})
(( i-- ))
done
echo ${new[@]}|tr -d ' '|tr '_' ' '
done
Tapi saya menggunakan tr dan sed, saya ingin tahu bagaimana melakukan split dengan benar dan kemudian saya akan memperbaikinya menjadi semua bash. Hanya untuk bersenang-senang.
[[ $string =~ ${string//?/(.)} ]]
akan ditetapkanBASH_REMATCH[]
sesuai kebutuhan, lihat jawaban saya untuk pertanyaan yang ditanyakan oleh Peter Mortensen untuk penjelasan.Jawaban:
Keluaran:
atau (harap dicatat komentarnya)
Keluaran:
sumber
while read -N 1 c; do a+=("$c"); done <<< "$s"
. The-N
memungkinkan untuk membaca bahkan baris, dan kutipan("$c")
menghindari ekspansi pathname (dan beberapa masalah lain).while read -N 1 c; do a+=("$c"); done <<< "$s"x
dan kemudian menghapus baris terakhir dan x menambahkan:unset a[${#a[@]}-1]; unset a[${#a[@]}-1]
.Untuk membagi string menjadi array karakter, dengan pembatas nol, Anda dapat:
Dengan pembatas selain null, Anda dapat:
sumber
IFS
dapat diatur, maka Anda hanya dapat melakukan:IFS=',' arr=($str)
.Hanya untuk bersenang-senang (dan kerang lainnya) varian lainnya:
Dan cek
akan dicetak
sumber
Metode 1:
Oneliner:
Kode yang diperluas:
Metode 2:
Oneliner:
Kode yang diperluas:
Terima kasih kepada @cuonglm dengan sarannya.
Secara efektif, Anda dapat menggunakan
$REPLY
itu adalah variabel default tempatread
membaca input.sumber
$REPLY
sebagai gantichar
variabel.