Vous avez export worker01="sdg sdh sdi sdj sdk"
, puis vous remplacez =
avec un espace pour obtenir export worker01 "sdg sdh sdi sdj sdk"
. Les champs séparés par des espaces qui sont export
, worker01
, "sdg
, sdh
, etc.
Il est probablement préférable de diviser en =
, et supprimez les guillemets, donc avec juste le 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
contient le nom de la variable, val
la valeur. Bien sûr, cela n'analyse pas réellement l'entrée, cela supprime simplement les guillemets doubles s'ils s'y trouvent.
Avec awk seul :
awk -F'"' '{print $2}' file.txt
# To print the variable name as well:
awk '{gsub(/[:=]/," "); gsub(/[:"]/,""); if ($1 = "export") {$1=""; print $0}}' file.txt
pour le boucler, vous pouvez :
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
Si vous souhaitez également imprimer le nom de la variable dans votre boucle, vous pouvez le faire :
#! /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
Sortie :
$ ./script.sh
worker01
sdg sdh sdi sdj sdk
worker02
sdg sdh sdi sdj sdm
worker03
sdg sdh sdi sdj sdf
Tout d'abord, vous pouvez obtenir les noms des variables avec cette commande GNU grep, en utilisant une regex compatible Perl :
grep -oP 'export \K[^=]+' file.txt
Ensuite, vous pouvez lire la sortie de cela dans un tableau bash avec :
mapfile -t variables < <(grep -oP 'export \K[^=]+' file.txt)
Qui utilise le bash intégré mapfile
commande et une substitution de processus.
Enfin, parcourez les noms de variables et utilisez indirect expansion des paramètres pour obtenir les valeurs :
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