#!/bin/bash # $HeadURL$ $LastChangedRevision$ # Modules . $(miniade) || { echo "${0##*/}: ERROR: miniade failed (hint: run 'miniade' to see error)" >&2; exit 1; } # Configurable stuff # Other globals main() { local MY_ARGS local -a LINEINFILE_OPTS # Defaults for options LOGIC=true PRESENT=unset BEFORE=unset AFTER=unset REPLACE=unset TEXT=unset FILE=unset # Process options special_opts_handler() { case $1 in --present=*) LINEINFILE_OPTS=("${LINEINFILE_OPTS[@]}" "$1") ;; --before=*) LINEINFILE_OPTS=("${LINEINFILE_OPTS[@]}" "$1") ;; --after=*) LINEINFILE_OPTS=("${LINEINFILE_OPTS[@]}" "$1") ;; --replace=*) LINEINFILE_OPTS=("${LINEINFILE_OPTS[@]}" "$1") ;; --text=*) LINEINFILE_OPTS=("${LINEINFILE_OPTS[@]}" "$1") ;; --file=*) FILE=${1#*=} ;; *) return 1 ;; esac } miniade_process_options --help-handler=help --special-opts-handler=special_opts_handler MY_ARGS "$@" && set -- "${MY_ARGS[@]}" # Process arguments [ $# = 0 ] || miniade_bad_usage # Sanity checks and derivations check_not_unset TEXT FILE [ -f "$FILE" ] || miniade_error "$FILE: not accessible" # Guts TMP_FILE=$(mktemp) TMP2_FILE=$(mktemp) ini2txt < $FILE > $TMP_FILE miniade_debug 10 "main: calling [lineinfile --debug=$VERBOSELEVEL ${LINEINFILE_OPTS[*]} --file=$TMP_FILE] ..." lineinfile --debug=$VERBOSELEVEL "${LINEINFILE_OPTS[@]}" --file=$TMP_FILE txt2ini < $TMP_FILE > $TMP2_FILE rm -f $TMP_FILE cmp -s $FILE $TMP2_FILE || cat $TMP2_FILE > $FILE rm -f $TMP2_FILE } ini2txt() { local LINE SECTION while read LINE; do if [[ $LINE =~ ^\[(.*)\]$ ]]; then SECTION=${BASH_REMATCH[1]} elif [[ $LINE =~ ^[\t\ ]*$ ]]; then : else echo "$SECTION:$LINE" fi done } txt2ini() { local LINE SECTION local -A SECTIONS cat > /tmp/$PROGNAME.$$.txt2ini while read LINE; do [[ $LINE =~ ^([^:]*):.* ]] SECTIONS[${BASH_REMATCH[1]}]=whatever done < /tmp/$PROGNAME.$$.txt2ini for SECTION in "${!SECTIONS[@]}"; do echo "[$SECTION]" sed -n "s/^$SECTION://p" /tmp/$PROGNAME.$$.txt2ini echo done } check_not_unset() { local VAR VAL for VAR in "$@"; do eval "VAL=\"\$$VAR\"" miniade_debug 20 "check_not_unset: VAR=$VAR, VAL=$VAL" [ "X$VAL" != Xunset ] || miniade_bad_usage done } check_all_but_one_unset() { local SET_COUNT UNSET_COUNT SET_COUNT=0 UNSET_COUNT=0 for VAR in "$@"; do eval "VAL=\$$VAR" miniade_debug 10 "check_all_but_one_unset: $VAR=$VAL" case $VAL in unset) ((++UNSET_COUNT)) ;; *) ((++SET_COUNT)) ;; esac done [ $SET_COUNT = 1 ] || miniade_bad_usage } help() { local PROGNAME miniade_get_progname PROGNAME echo "Usage: $PROGNAME [ ] --text= --file= [ --present= ] --{before|after|replace}=" exit 0 } main "$@"