Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Parse YAML from bash with sed and awk.
development:
adapter: mysql2
encoding: utf8
database: my_database
username: root
password:
apt:
- somepackage
- anotherpackage
development_adapter=("mysql2")
development_encoding=("utf8")
development_database=("my_database")
development_username=("root")
development_apt+=("somepackage")
development_apt+=("anotherpackage")
#!/usr/bin/env bash
#
# vim: set ft=sh:
#
# Based on https://gist.github.com/pkuczynski/8665367
parse_yaml() {
local prefix=$2
local s
local w
local fs
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);
}
}' | sed 's/_=/+=/g'
}
parse_yaml config.yml
@phiarchitect

This comment has been minimized.

Copy link

@phiarchitect phiarchitect commented Jul 13, 2020

this is ingenious.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.