Search
 
SCRIPT & CODE EXAMPLE
 
CODE EXAMPLE FOR SHELL

bash yaml parser library

function parse_yaml {
   local prefix=$2
   local s='[[:space:]]*' w='[a-zA-Z0-9_]*' fs=$(echo @|tr @ '34')
   sed -ne "s|,$s]$s$|]|" 
        -e ":1;s|^($s)($w)$s:$s[$s(.*)$s,$s(.*)$s]|12: [3]
1  - 4|;t1" 
        -e "s|^($s)($w)$s:$s[$s(.*)$s]|12:
1  - 3|;p" $1 | 
   sed -ne "s|,$s}$s$|}|" 
        -e ":1;s|^($s)-$s{$s(.*)$s,$s($w)$s:$s(.*)$s}|1- {2}
1  3: 4|;t1" 
        -e    "s|^($s)-$s{$s(.*)$s}|1-
1  2|;p" | 
   sed -ne "s|^($s):|1|" 
        -e "s|^($s)-$s["'](.*)["']$s$|1$fs$fs2|p" 
        -e "s|^($s)-$s(.*)$s$|1$fs$fs2|p" 
        -e "s|^($s)($w)$s:$s["'](.*)["']$s$|1$fs2$fs3|p" 
        -e "s|^($s)($w)$s:$s(.*)$s$|1$fs2$fs3|p" | 
   awk -F$fs '{
      indent = length($1)/2;
      vname[indent] = $2;
      for (i in vname) {if (i > indent) {delete vname[i]; idx[i]=0}}
      if(length($2)== 0){  vname[indent]= ++idx[indent] };
      if (length($3) > 0) {
         vn=""; for (i=0; i<indent; i++) { vn=(vn)(vname[i])("_")}
         printf("%s%s%s="%s"
", "'$prefix'",vn, vname[indent], $3);
      }
   }'
}


>>> eval $(parse_yaml test.yaml "")

# Input test.yaml
global:
  input:
    - "main.c"
    - "main.h"
  flags: [ "-O3", "-fpic" ]
  sample_input:
    -  { property1: value, property2: "value2" }
    -  { property1: "value3", property2: 'value 4' }
    
# Output for parse_yaml
global_input_1="main.c"
global_input_2="main.h"
global_flags_1="-O3"
global_flags_2="-fpic"
global_sample_input_1_property1="value"
global_sample_input_1_property2="value2"
global_sample_input_2_property1="value3"
global_sample_input_2_property2="value 4"

Source by stackoverflow.com #
 
PREVIOUS NEXT
Tagged: #bash #yaml #parser #library
ADD COMMENT
Topic
Name
9+4 =