Máte export worker01="sdg sdh sdi sdj sdk"
, pak nahradíte =
s mezerou pro získání export worker01 "sdg sdh sdi sdj sdk"
. Pole oddělená mezerami jsou export
, worker01
, "sdg
, sdh
, atd.
Pravděpodobně je lepší rozdělit na =
a odstraňte uvozovky, takže pouze pomocí shellu:
$ 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
obsahuje název proměnné val
hodnota. Samozřejmě to ve skutečnosti neanalyzuje vstup, pouze odstraní dvojité uvozovky, pokud tam náhodou jsou.
Pomocí awk sám:
awk -F'"' '{print $2}' file.txt
# To print the variable name as well:
awk '{gsub(/[:=]/," "); gsub(/[:"]/,""); if ($1 = "export") {$1=""; print $0}}' file.txt
pro opakování můžete:
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
Pokud chcete také vytisknout název proměnné ve vaší smyčce, můžete to udělat takto:
#! /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
Výstup:
$ ./script.sh
worker01
sdg sdh sdi sdj sdk
worker02
sdg sdh sdi sdj sdm
worker03
sdg sdh sdi sdj sdf
Nejprve můžete získat názvy proměnných pomocí tohoto příkazu GNU grep pomocí regulárního výrazu Perl-compat:
grep -oP 'export \K[^=]+' file.txt
Poté můžete načíst jeho výstup do pole bash pomocí:
mapfile -t variables < <(grep -oP 'export \K[^=]+' file.txt)
To používá vestavěný bash mapfile
příkaz a substituce procesu.
Nakonec iterujte názvy proměnných a použijte nepřímé rozšíření parametru pro získání hodnot:
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