Anda memiliki export worker01="sdg sdh sdi sdj sdk"
, lalu anda ganti =
dengan spasi untuk mendapatkan export worker01 "sdg sdh sdi sdj sdk"
. Kolom yang dipisahkan spasi adalah export
, worker01
, "sdg
, sdh
, dll.
Mungkin lebih baik membagi pada =
, dan hapus tanda kutip, jadi hanya dengan Shell:
$ while IFS== read -r key val ; do
val=${val%\"}; val=${val#\"}; key=${key#export };
echo "$key = $val";
done < vars
worker01 = sdg sdh sdi sdj sdk
worker02 = sdg sdh sdi sdj sdm
worker03 = sdg sdh sdi sdj sdf
key
berisi nama variabel, val
nilai. Tentu saja ini tidak benar-benar mengurai input, ini hanya menghapus tanda kutip ganda jika ada di sana.
Dengan awk sendirian:
awk -F'"' '{print $2}' file.txt
# To print the variable name as well:
awk '{gsub(/[:=]/," "); gsub(/[:"]/,""); if ($1 = "export") {$1=""; print $0}}' file.txt
untuk memutarnya Anda dapat:
for i in "$(awk -F\" '{print $2}' file.txt)"; do
var="$i"
echo "$var"
done
my_array=($(awk -F\" '{print $2}' file.txt))
for element in "${my_var[@]}"; do
another_var="$element"
echo "$another_var"
done
Jika Anda juga ingin mencetak nama variabel di loop Anda, Anda dapat melakukan ini:
#! /usr/bin/env bash -
while read -r line; do
if [[ "$(awk '{print $1}' <<<"$line")" == 'export' ]]; then
var_name="$(awk '{print $2}' <<<"$line" | awk -F'=' '{print $1}')"
var_value="$(awk -F\" '{print $2}' <<<"$line")"
echo -e "${var_name}\n${var_value}"
else
continue
fi
done<file.txt
Keluaran:
$ ./script.sh
worker01
sdg sdh sdi sdj sdk
worker02
sdg sdh sdi sdj sdm
worker03
sdg sdh sdi sdj sdf
Pertama, Anda bisa mendapatkan nama variabel dengan perintah grep GNU ini, menggunakan regex Perl-compat:
grep -oP 'export \K[^=]+' file.txt
Kemudian, Anda dapat membaca hasilnya ke dalam bash array dengan:
mapfile -t variables < <(grep -oP 'export \K[^=]+' file.txt)
Itu menggunakan bash builtin mapfile
perintah dan substitusi proses.
Terakhir, ulangi nama variabel dan gunakan tidak langsung perluasan parameter untuk mendapatkan nilai:
for v in "${variables[@]}"; do
printf "varname=%s\tvalue=%s\n" "$v" "${!v}"
done
varname=worker01 value=sdg sdh sdi sdj sdk
varname=worker02 value=sdg sdh sdi sdj sdm
varname=worker03 value=sdg sdh sdi sdj sdf