Last active
August 23, 2021 07:15
-
-
Save redsfyre/c8dc6a4897414741ed97314b3fd314ba to your computer and use it in GitHub Desktop.
An extended yaml parser for bash scripts. Copied from https://stackoverflow.com/a/21189044/13756006 and https://stackoverflow.com/a/51789677/13756006 and https://github.com/mrbaseman/parse_yaml Note: This gist was created so that I can easily access these scripts when needed.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/sh | |
function parse_yaml { | |
local prefix=$2 | |
local s='[[:space:]]*' w='[a-zA-Z0-9_]*' fs=$(echo @|tr @ '\034') | |
sed -ne "s|^\($s\):|\1|" \ | |
-e "s|^\($s\)\($w\)$s:$s[\"']\(.*\)[\"']$s\$|\1$fs\2$fs\3|p" \ | |
-e "s|^\($s\)\($w\)$s:$s\(.*\)$s\$|\1$fs\2$fs\3|p" $1 | | |
awk -F$fs '{ | |
indent = length($1)/2; | |
vname[indent] = $2; | |
for (i in vname) {if (i > indent) {delete vname[i]}} | |
if (length($3) > 0) { | |
vn=""; for (i=0; i<indent; i++) {vn=(vn)(vname[i])("_")} | |
printf("%s%s%s=\"%s\"\n", "'$prefix'",vn, $2, $3); | |
} | |
}' | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/sh | |
function parse_yaml { | |
local prefix=$2 | |
local s='[[:space:]]*' w='[a-zA-Z0-9_]*' fs=$(echo @|tr @ '\034') | |
sed -ne "s|,$s\]$s\$|]|" \ | |
-e ":1;s|^\($s\)\($w\)$s:$s\[$s\(.*\)$s,$s\(.*\)$s\]|\1\2: [\3]\n\1 - \4|;t1" \ | |
-e "s|^\($s\)\($w\)$s:$s\[$s\(.*\)$s\]|\1\2:\n\1 - \3|;p" $1 | \ | |
sed -ne "s|,$s}$s\$|}|" \ | |
-e ":1;s|^\($s\)-$s{$s\(.*\)$s,$s\($w\)$s:$s\(.*\)$s}|\1- {\2}\n\1 \3: \4|;t1" \ | |
-e "s|^\($s\)-$s{$s\(.*\)$s}|\1-\n\1 \2|;p" | \ | |
sed -ne "s|^\($s\):|\1|" \ | |
-e "s|^\($s\)-$s[\"']\(.*\)[\"']$s\$|\1$fs$fs\2|p" \ | |
-e "s|^\($s\)-$s\(.*\)$s\$|\1$fs$fs\2|p" \ | |
-e "s|^\($s\)\($w\)$s:$s[\"']\(.*\)[\"']$s\$|\1$fs\2$fs\3|p" \ | |
-e "s|^\($s\)\($w\)$s:$s\(.*\)$s\$|\1$fs\2$fs\3|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\"\n", "'$prefix'",vn, vname[indent], $3); | |
} | |
}' | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/sh | |
function parse_yaml { | |
local prefix=$2 | |
local separator=${3:-_} | |
local indexfix | |
# Detect awk flavor | |
if awk --version 2>&1 | grep -q "GNU Awk" ; then | |
# GNU Awk detected | |
indexfix=-1 | |
elif awk -Wv 2>&1 | grep -q "mawk" ; then | |
# mawk detected | |
indexfix=0 | |
fi | |
local s='[[:space:]]*' sm='[ \t]*' w='[a-zA-Z0-9_]*' fs=${fs:-$(echo @|tr @ '\034')} i=${i:- } | |
cat $1 | \ | |
awk -F$fs "{multi=0; | |
if(match(\$0,/$sm\|$sm$/)){multi=1; sub(/$sm\|$sm$/,\"\");} | |
if(match(\$0,/$sm>$sm$/)){multi=2; sub(/$sm>$sm$/,\"\");} | |
while(multi>0){ | |
str=\$0; gsub(/^$sm/,\"\", str); | |
indent=index(\$0,str); | |
indentstr=substr(\$0, 0, indent+$indexfix) \"$i\"; | |
obuf=\$0; | |
getline; | |
while(index(\$0,indentstr)){ | |
obuf=obuf substr(\$0, length(indentstr)+1); | |
if (multi==1){obuf=obuf \"\\\\n\";} | |
if (multi==2){ | |
if(match(\$0,/^$sm$/)) | |
obuf=obuf \"\\\\n\"; | |
else obuf=obuf \" \"; | |
} | |
getline; | |
} | |
sub(/$sm$/,\"\",obuf); | |
print obuf; | |
multi=0; | |
if(match(\$0,/$sm\|$sm$/)){multi=1; sub(/$sm\|$sm$/,\"\");} | |
if(match(\$0,/$sm>$sm$/)){multi=2; sub(/$sm>$sm$/,\"\");} | |
} | |
print}" | \ | |
sed -e "s|^\($s\)?|\1-|" \ | |
-ne "s|^$s#.*||;s|$s#[^\"']*$||;s|^\([^\"'#]*\)#.*|\1|;t1;t;:1;s|^$s\$||;t2;p;:2;d" | \ | |
sed -ne "s|,$s\]$s\$|]|" \ | |
-e ":1;s|^\($s\)\($w\)$s:$s\(&$w\)\?$s\[$s\(.*\)$s,$s\(.*\)$s\]|\1\2: \3[\4]\n\1$i- \5|;t1" \ | |
-e "s|^\($s\)\($w\)$s:$s\(&$w\)\?$s\[$s\(.*\)$s\]|\1\2: \3\n\1$i- \4|;" \ | |
-e ":2;s|^\($s\)-$s\[$s\(.*\)$s,$s\(.*\)$s\]|\1- [\2]\n\1$i- \3|;t2" \ | |
-e "s|^\($s\)-$s\[$s\(.*\)$s\]|\1-\n\1$i- \2|;p" | \ | |
sed -ne "s|,$s}$s\$|}|" \ | |
-e ":1;s|^\($s\)-$s{$s\(.*\)$s,$s\($w\)$s:$s\(.*\)$s}|\1- {\2}\n\1$i\3: \4|;t1" \ | |
-e "s|^\($s\)-$s{$s\(.*\)$s}|\1-\n\1$i\2|;" \ | |
-e ":2;s|^\($s\)\($w\)$s:$s\(&$w\)\?$s{$s\(.*\)$s,$s\($w\)$s:$s\(.*\)$s}|\1\2: \3 {\4}\n\1$i\5: \6|;t2" \ | |
-e "s|^\($s\)\($w\)$s:$s\(&$w\)\?$s{$s\(.*\)$s}|\1\2: \3\n\1$i\4|;p" | \ | |
sed -e "s|^\($s\)\($w\)$s:$s\(&$w\)\(.*\)|\1\2:\4\n\3|" \ | |
-e "s|^\($s\)-$s\(&$w\)\(.*\)|\1- \3\n\2|" | \ | |
sed -ne "s|^\($s\):|\1|" \ | |
-e "s|^\($s\)\(---\)\($s\)||" \ | |
-e "s|^\($s\)\(\.\.\.\)\($s\)||" \ | |
-e "s|^\($s\)-$s[\"']\(.*\)[\"']$s\$|\1$fs$fs\2|p;t" \ | |
-e "s|^\($s\)\($w\)$s:$s[\"']\(.*\)[\"']$s\$|\1$fs\2$fs\3|p;t" \ | |
-e "s|^\($s\)-$s\(.*\)$s\$|\1$fs$fs\2|" \ | |
-e "s|^\($s\)\($w\)$s:$s[\"']\?\(.*\)$s\$|\1$fs\2$fs\3|" \ | |
-e "s|^\($s\)[\"']\?\([^&][^$fs]\+\)[\"']$s\$|\1$fs$fs$fs\2|" \ | |
-e "s|^\($s\)[\"']\?\([^&][^$fs]\+\)$s\$|\1$fs$fs$fs\2|" \ | |
-e "s|$s\$||p" | \ | |
awk -F$fs "{ | |
gsub(/\t/,\" \",\$1); | |
if(NF>3){if(value!=\"\"){value = value \" \";}value = value \$4;} | |
else { | |
if(match(\$1,/^&/)){anchor[substr(\$1,2)]=full_vn;getline}; | |
indent = length(\$1)/length(\"$i\"); | |
vname[indent] = \$2; | |
value= \$3; | |
for (i in vname) {if (i > indent) {delete vname[i]; idx[i]=0}} | |
if(length(\$2)== 0){ vname[indent]= ++idx[indent] }; | |
vn=\"\"; for (i=0; i<indent; i++) { vn=(vn)(vname[i])(\"$separator\")} | |
vn=\"$prefix\" vn; | |
full_vn=vn vname[indent]; | |
if(vn==\"$prefix\")vn=\"$prefix$separator\"; | |
if(vn==\"_\")vn=\"__\"; | |
} | |
assignment[full_vn]=value; | |
if(!match(assignment[vn], full_vn))assignment[vn]=assignment[vn] \" \" full_vn; | |
if(match(value,/^\*/)){ | |
ref=anchor[substr(value,2)]; | |
if(length(ref)==0){ | |
printf(\"%s=\\\"%s\\\"\n\", full_vn, value); | |
} else { | |
for(val in assignment){ | |
if((length(ref)>0)&&index(val, ref)==1){ | |
tmpval=assignment[val]; | |
sub(ref,full_vn,val); | |
if(match(val,\"$separator\$\")){ | |
gsub(ref,full_vn,tmpval); | |
} else if (length(tmpval) > 0) { | |
printf(\"%s=\\\"%s\\\"\n\", val, tmpval); | |
} | |
assignment[val]=tmpval; | |
} | |
} | |
} | |
} else if (length(value) > 0) { | |
printf(\"%s=\\\"%s\\\"\n\", full_vn, value); | |
} | |
}END{ | |
for(val in assignment){ | |
if(match(val,\"$separator\$\")) | |
printf(\"%s=\\\"%s\\\"\n\", val, assignment[val]); | |
} | |
}" | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment