#!/usr/bin/env bash set -euo pipefail # @describe Remove empty values from JSON # @meta require-tools jq # @arg file=- input file name # @flag -n --remove-nulls remove nulls # @flag -N --keep-nulls keep nulls # @flag -e --remove-empty-strings remove empty strings # @flag -E --keep-empty-strings keep empty strings # @flag -b --remove-blank-strings remove blank strings # @flag -B --keep-blank-strings keep blank strings # @flag -a --remove-empty-arrays remove empty arrays # @flag -A --keep-empty-arrays keep empty arrays # @flag -o --remove-empty-objects remove empty objects # @flag -O --keep-empty-objects keep empty objects # @flag --keep-all keep all # @flag --print-filter print used JQ filter join_by() { local delimiter="$1" local result shift result=$(printf "%s$delimiter" "$@") result=${result%"$delimiter"} echo "$result" } print_jq_filter() { local filters [ "${argc_keep_nulls:-0}" = 0 ] && filters+=(". == null") [ "${argc_keep_empty_strings:-0}" = 0 ] && filters+=('. == ""') [ "${argc_keep_blank_strings:-0}" = 0 ] && filters+=('(. | tostring | test("^[[:space:]]*$"))') [ "${argc_keep_empty_arrays:-0}" = 0 ] && filters+=('. == []') [ "${argc_keep_empty_objects:-0}" = 0 ] && filters+=('. == {}') echo "del(..|select($(join_by " or " "${filters[@]}")))" } main() { local jq_filter jq_filter=$(print_jq_filter) [ "${argc_print_filter:-}" = 1 ] && echo "JQ Filter: $jq_filter" >&2 jq "$jq_filter" "${argc_file?}" } eval "$(argc --argc-eval "$0" "$@")"