67 lines
1.9 KiB
Bash
Executable File
67 lines
1.9 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
set -e
|
|
|
|
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')
|
|
else
|
|
# assume the argument is a table
|
|
TABLE="$argv1"
|
|
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
|
|
else
|
|
printf "%s\n" "$VAL"
|
|
fi
|
|
|
|
exit 0
|