#!/bin/sh | |
parse_yaml() { | |
local prefix=$2 | |
local s='[[:space:]]*' w='[a-zA-Z0-9_]*' fs=$(echo @|tr @ '\034') | |
sed -ne "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); | |
} | |
}' | |
} |
#!/bin/sh | |
# include parse_yaml function | |
. parse_yaml.sh | |
# read yaml file | |
eval $(parse_yaml zconfig.yml "config_") | |
# access yaml content | |
echo $config_development_database |
development: | |
adapter: mysql2 | |
encoding: utf8 | |
database: my_database | |
username: root | |
password: |
Works great.
nice script!
Works really well, thank you!
description: sample message here
may overflow next line
I have a similar issue how could we store description variable that may overflow into the next line in the same
1_2_1_description="sample message here"
TO
1_2_1_description="sample message here may overflow next line"
Thank you!
I think python is superior in this scripting situation. why on earth anyone would use a bash script to do such a thing? python is generally pre-installed in mac and Linux.
python is so much clean and readable.
pip install pyyaml
import yaml
FILENAME = 'your_file.yml'
with open(FILENAME) as file:
data:dict = yaml.full_load(file)
# data is a python dictionary
The traversal logic is super. Love it !! Sometimes its just fun to do these crazy stuff with Bash.
jq for JSON and yq for YAML
https://github.com/mikefarah/yq
Hi all! This is very interested thread. Anybody knows how to make it working where string spans several lines (through "|" pipe), example:
key1: |
1st line
2nd line
3rd line
key2: |
1st line
2nd line
3rd line
thanks for this.
added this to end after awk
as a hack not to interpret $
interpolation (application: reading serverless.yml config into bash)
| tr "$" "#" # don't want to interpret $
i cant figure out why its not running succesfully for me whenever i execute ./test.sh it gives me error
./test.sh
./test.sh: line 4: .: parse_yaml.sh: file not found
./test.sh: line 7: parse_yaml: command not found
has anybody else faced this issue please help
@Nigam8972 try with
. ./parse_yaml.sh
if they are in the same folder (it's what I use)
Cool, just discovered this; of course the more recent suggestions are more robust and feature-rich, but I found myself needing this on constrained (i.e. busybox, sh
and no python
) systems where going POSIX-sh only is the way to go.
The method here by @wadewegner (or similar) to pre-process problematic keys (but not their values) was the way to go, i.e. by using "advanced" sed
hold-space etc.
Hi! What is the expected output from running test.sh? Perhaps listing an output file above would be useful.