Esta es la contestación más completa que te podemos aportar, pero primero mírala pausadamente y valora si se puede adaptar a tu proyecto.
Solución:
Tú tienes export worker01="sdg sdh sdi sdj sdk"
entonces reemplazas =
con un espacio para conseguir export worker01 "sdg sdh sdi sdj sdk"
. Los campos separados por espacios en los que se export
, worker01
, "sdg
, sdh
etc.
Probablemente sea mejor dividir =
y elimine las comillas, así que solo con el 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
contiene el nombre de la variable, val
el valor. Por supuesto, esto en realidad no analiza la entrada, simplemente elimina las comillas dobles si están allí.
Con awk solo:
awk -F'"' 'print $2' file.txt
# To print the variable name as well:
awk 'gsub(/[:=]/," "); gsub(/[:"]/,""); if ($1 = "export") $1=""; print $0' file.txt
para hacer un bucle puedes:
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 también desea imprimir el nombre de la variable en su ciclo, puede hacer esto:
#! /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_namen$var_value"
else
continue
fi
done
Producción:
$ ./script.sh
worker01
sdg sdh sdi sdj sdk
worker02
sdg sdh sdi sdj sdm
worker03
sdg sdh sdi sdj sdf
Primero, puede obtener los nombres de las variables con este comando GNU grep, usando una expresión regular compatible con Perl:
grep -oP 'export K[^=]+' file.txt
Luego, puedes leer la salida de eso en un bash array con:
mapfile -t variables < <(grep -oP 'export K[^=]+' file.txt)
Eso usa el bash incorporado mapfile
comando y una sustitución de proceso.
Por último, itere sobre los nombres de las variables y use indirecto expansión de parámetros para obtener los valores:
for v in "$variables[@]"; do
printf "varname=%stvalue=%sn" "$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