#!/bin/sh set -e argv0="$0" argv1="$1" argv2="$2" # check usage if ! test -n "$1"; then printf "Usage: %s [OPTIONS] [TABLE.KEY[INDEX]] [FILE]\n" "$0" 1>&2 exit 64 # sysexits(3) EX_USAGE fi # test if input has a period if test -n "$(printf "%s\n" "$argv1" | sed -n '/.*\..*/p')"; then # cut out everything beyond the first period for TABLE TABLE=$(printf "%s\n" "$argv1" | sed -n 's/\..*//p') # cut out everything before the first period for KEY KEY=$(printf "%s\n" "$argv1" | sed -n 's/^[^.]*\.//p') ! test -n "$KEY" &&\ printf "%s: No key specified\n" "$argv0" 1>&2 &&\ exit 65 # sysexits(3) EX_DATAERR else printf "%s: No key specified\n" "$argv0" 1>&2 exit 65 # sysexits(3) EX_DATAERR fi # remove array index from KEY KEY=$(printf "%s\n" "$KEY" | sed 's/\[.*\]//g') # set ARR to the array index ARR=$(printf "%s\n" "$argv1" | sed -n 's/.\+\[//p' | tr -d ']') # test if argument 2 is a file or not if test -e "$argv2"; then # set TOML to the text from the file TOML=$(sed 's/[^"#]#\+.*//g' <"$argv2" | sed 's/^#.*//g' ) else # set TOML to the text from stdin TOML=$(printf "%s\n" "$argv2" | sed 's/[^"#]#\+.*//g') fi if test -n "$TABLE"; then KEYS=$(printf "%s\n" "$TOML" |\ # output only lines between TABLE and the next table awk "/^\[$TABLE\]/{flag=1; next} /^\[/{flag=0} flag" - ) else KEYS=$(printf "%s\n" "$TOML" |\ # output only lines before the first table awk '1;/^\[/{exit}' - | sed -n '/^[^[]/p') fi # set VAL to the parsed KEYS list VAL=$(printf "%s\n" "$KEYS" |\ # remove the key from the string and delineate arrays, removing # brackets, trailing commas, and leading spaces sed -n "s/$KEY *= *//p" | sed 's/", "/ /g' | tr -d '[]"' |\ sed 's/, *$//g' | sed 's/^ \+//g' | sed 's/ \+$//g') # test if ARR is set; if it is, then we have an array index to grab if test -n "$ARR"; then # change the line delineator to newlines for parsing and output the result printf "%s\n" "$VAL" | sed 's/ /\n/g' | head -n "$ARR" |\ tail -n 1 elif ! test -n "$VAL"; then printf "%s: %s: No such key or table\n" "$argv0" "$argv1" 1>&2 exit 65 # sysexits(3) EX_DATAERR else printf "%s\n" "$VAL" fi exit 0