Saya memiliki file.txt yang perlu saya baca menjadi array Bash. Maka saya perlu menghapus spasi, tanda kutip ganda dan semua kecuali koma pertama di setiap entri . Inilah sejauh mana saya mendapatkan:
$ cat file.txt
10,this
2 0 , i s
30,"all"
40,I
50,n,e,e,d,2
60",s e,e"
$ cat script.sh
#!/bin/bash
readarray -t ARRAY<$1
ARRAY=( "${ARRAY[@]// /}" )
ARRAY=( "${ARRAY[@]//\"/}" )
for ELEMENT in "${ARRAY[@]}";do
echo "|ELEMENT|$ELEMENT|"
done
$ ./script.sh file.txt
|ELEMENT|10,this|
|ELEMENT|20,is|
|ELEMENT|30,all|
|ELEMENT|40,I|
|ELEMENT|50,n,e,e,d,2|
|ELEMENT|60,se,e|
Yang berfungsi hebat kecuali untuk situasi koma. Saya sadar bahwa ada beberapa cara untuk menguliti kucing ini, tetapi karena skrip yang lebih besar ini adalah bagian dari, saya benar-benar ingin menggunakan substitusi parameter untuk sampai ke sini:
|ELEMENT|10,this|
|ELEMENT|20,is|
|ELEMENT|30,all|
|ELEMENT|40,I|
|ELEMENT|50,need2|
|ELEMENT|60,see|
Apakah ini mungkin melalui substitusi parameter?
awk
ataused
melakukan pemrosesan data?Jawaban:
Saya akan menghapus apa yang perlu Anda hapus menggunakan
sed
sebelum memuat ke dalam array (juga perhatikan nama variabel huruf kecil, secara umum yang terbaik adalah menghindari variabel kapital dalam skrip shell):Ini menghasilkan output berikut pada file contoh Anda:
Jika Anda benar-benar harus menggunakan substitusi parameter, coba sesuatu seperti ini:
sumber
RANDOMTEXTTHATWILLNEVERBEINTHEFILE
.Sejauh yang saya bisa lihat, tidak perlu membacanya ke dalam
bash
array untuk membuat output:The
sed
ekspresi menghapus spasi dan tanda kutip ganda, menggantikan koma pertama dengan ruang (tidak ada ruang lain dalam string pada saat ini), menghapus semua koma lainnya, mengembalikan koma pertama, dan prepends dan menambahkan data tambahan.Atau, dengan GNU
sed
:(standar
sed
tidak mendukung kombinasi2
dang
sebagai tanda padas
perintah).sumber
's/,//2g
untuk menghapus koma, dimulai dengan 2nds/.*/|ELEMENT|&|/
tetapi itu mungkin lebih banyak upaya untuk sed.Keluar dari kebiasaan menggunakan nama variabel ALLCAPS. Anda akhirnya akan bertabrakan dengan variabel "sistem" penting seperti PATH dan memecah kode Anda.
sumber
PATH=something; ls $PATH
dan kemudian bertanya-tanya tentangls: command not found
kesalahannya.[Ini pada dasarnya adalah versi yang lebih lengkap dari jawaban glenn jackmann ]
Membangun array asosiatif dari kunci dan nilai yang dilucuti, menggunakan koma pertama sebagai pemisah:
sumber
Anda bisa mengulang array dan menggunakan variabel perantara:
Ini menetapkan
rest
bagian setelah koma pertama; kami kemudian menggabungkan tiga bagian kembali ke variabel asli:rest
setiap koma tanpa apa punsumber