Sample Header Ad - 728x90

Generate templates in yaml from a CSV file

1 vote
3 answers
3326 views
I am trying to create yaml files from a template using my variables. My yaml template look like this number: {{NUMBER}} name: {{NAME}} region: {{REGION}} storenum: {{STORENUM}} clients: {{CLIENTS}} tags: {{TAGS}} storename: {{STORENAME}} employee: {{EMPLOYEE}} products: {{PRODUCTS}} But my variables are in a CSV file; the structure is the variables. Number - Name - Region - Storenum StoreX - StoreX - New York - 30 I now have a little script to create from a template with the variable parameters and the template like this: script.sh template.yml -f variables.txt. And my result looks like this number: 37579922 name: Store1 region: New York storenum: 32 clients: 100 tags: stores storename: Store newyork employee: 10 products: 200 But I can only do one at a time. Is there any way to read the CSV parameters and send to the program and generate, for example, Template1,Template2,etc from the CSV parameters? #!/bin/bash readonly PROGNAME=$(basename $0) config_file="" print_only="false" silent="false" usage="${PROGNAME} [-h] [-d] [-f] [-s] -- where: -h, --help Show this help text -p, --print Don't do anything, just print the result of the variable expansion(s) -f, --file Specify a file to read variables from -s, --silent Don't print warning messages (for example if no variables are found) examples: VAR1=Something VAR2=1.2.3 ${PROGNAME} test.txt ${PROGNAME} test.txt -f my-variables.txt ${PROGNAME} test.txt -f my-variables.txt > new-test.txt" if [ $# -eq 0 ]; then echo "$usage" exit 1 fi if [[ ! -f "${1}" ]]; then echo "You need to specify a template file" >&2 echo "$usage" exit 1 fi template="${1}" if [ "$#" -ne 0 ]; then while [ "$#" -gt 0 ] do case "$1" in -h|--help) echo "$usage" exit 0 ;; -p|--print) print_only="true" ;; -f|--file) config_file="$2" ;; -s|--silent) silent="true" ;; --) break ;; -*) echo "Invalid option '$1'. Use --help to see the valid options" >&2 exit 1 ;; # an option argument, continue *) ;; esac shift done fi vars=$(grep -oE '\{\{[A-Za-z0-9_]+\}\}' "${template}" | sort | uniq | sed -e 's/^{{//' -e 's/}}$//') if [[ -z "$vars" ]]; then if [ "$silent" == "false" ]; then echo "Warning: No variable was found in ${template}, syntax is {{VAR}}" >&2 fi fi # Load variables from file if needed if [ "${config_file}" != "" ]; then if [[ ! -f "${config_file}" ]]; then echo "The file ${config_file} does not exists" >&2 echo "$usage" exit 1 fi source "${config_file}" fi var_value() { eval echo \$$1 } replaces="" # Reads default values defined as {{VAR=value}} and delete those lines # There are evaluated, so you can do {{PATH=$HOME}} or {{PATH=pwd}} # You can even reference variables defined in the template before defaults=$(grep -oE '^\{\{[A-Za-z0-9_]+=.+\}\}' "${template}" | sed -e 's/^{{//' -e 's/}}$//') for default in $defaults; do var=$(echo "$default" | grep -oE "^[A-Za-z0-9_]+") current=var_value $var # Replace only if var is not set if [[ -z "$current" ]]; then eval $default fi # remove define line replaces="-e '/^{{$var=/d' $replaces" vars="$vars $current" done vars=$(echo $vars | sort | uniq) if [[ "$print_only" == "true" ]]; then for var in $vars; do value=var_value $var echo "$var = $value" done exit 0 fi # Replace all {{VAR}} by $VAR value for var in $vars; do value=$(var_value $var | sed -e "s;\&;\\\&;g" -e "s;\ ;\\\ ;g") # '&' and is escaped if [[ -z "$value" ]]; then if [ $silent == "false" ]; then echo "Warning: $var is not defined and no default is set, replacing by empty" >&2 fi fi # Escape slashes value=$(echo "$value" | sed 's/\//\\\//g'); replaces="-e 's/{{$var}}/${value}/g' $replaces" done escaped_template_path=$(echo $template | sed 's/ /\\ /g') eval sed $replaces "$escaped_template_path"
Asked by Jo0l (11 rep)
Oct 2, 2021, 06:34 PM
Last activity: Oct 21, 2021, 11:49 PM