As a follow-up to my post of a few weeks ago (excerpted below), here are two bash procedures I wrote for my bashrc to demonstrate what I mean. Even if the idea doesn't rise to a level to be integrated as bash features, maybe some readers of this list or other bash users will find these useful.
Cheers. CONTENTS ========= hrm - a bash function to remove multiple lines from the bash history hgrep - display multiple search solutions from within the current shell context's history function hrm { # remove a range of lines from the history todolist=() function usage_message { echo -e "\nhrm - remove multiple entries from history\nusage: hrm { n-m | n,m | n }\n n-m delete from entry n until entry m\n n,m starting from entry n, delete m entries\n n delete individual entry n" } function error_message { echo "error: a parameter is non-numeric or out of bounds: "$myparm usage_message } if [[ -z "$@" ]] || [[ "$1" =~ ^-[h?]$ ]] || [[ "$1" == "--help" ]]; then usage_message return fi for myparm in "$@" ;do if [[ "$myparm" =~ ^[[:digit:]]*-[[:digit:]]*$ ]]; then n=${myparm%%-*} m=${myparm##*-} if [[ $n == 0 ]] || [[ $m == 0 ]] || \ [[ $n -ge $HISTCMD ]] || [[ $m -ge $HISTCMD ]] ; then error_message return else if [[ $n == $m ]] ; then echo "warning: start and end numbers identical: "$myparm read -p "continue anyway? (y/N)" [ "$REPLY" != "y" ] && return elif [[ $n -gt $m ]] ; then echo "warning: start "$n", greater than end, "$m read -p "continue anyway? (y/N)" [ "$REPLY" != "y" ] && return z=$m; m=$n; n=$z fi while [[ $n -le $m ]]; do todolist=("${todolist[@]}" $m) let m-- done fi elif [[ "$myparm" =~ ^[[:digit:]]*,[[:digit:]]*$ ]]; then n=${myparm%%,*} z=${myparm##*,} let m=$n+$z-1 if [[ $n == 0 ]] || [[ $z == 0 ]] || \ [[ $n -ge $HISTCMD ]] || [[ $m -ge $HISTCMD ]] ; then error_message else while [[ $n -le $m ]]; do todolist=("${todolist[@]}" $m) let m-- done fi else if ! [[ "$myparm" =~ ^[[:digit:]]*$ ]] || \ [[ $myparm == 0 ]] || \ [[ $myparm -ge $HISTCMD ]] ; then error_message return fi todolist=("${todolist[@]}" $myparm) fi done for myparm in $(oldIFS="$IFS"; IFS=$'\n'; \ sort -g -r -u <<< "${todolist[*]}"; \ IFS="$oldIFS"); do history -d $myparm done history -w } function hgrep { if [[ -z "$@" ]] || [[ "$1" =~ ^-[h?]$ ]] || [[ "$1" == "--help" ]]; then echo -e "hgrep - grep for bash's history buffer\nUsage: hgrep [grep options] [grep pattern]" return fi history | grep -v -e hgrep -e history | grep $* echo "To edit a line, enter !nn <alt> ^" } > 1] display multiple solutions for a bash history search - Instead of a > user having to repeat the crtl-r/ctrl-s sequence, and have each solution > overwrite the previous one, allow the user to prefix ctrl-r/ctrl-s with an > integer for the maximum number of entries to display. Maybe prefix each > solution with it's line number in the history, so that the desired > solution could be invoked using !nn > > 2] Add a feature for history -d to delete more than one line of the > history. Maybe history -d n,m to delete lines n through m, or history -d > n:m to delete m lines beginning with line number n. > > 3] Add a feature for history -d to delete multiple lines based upon a > regular expression. > EXAMPLES: > history -d n ^man* - delete the n most recent history lines that begin > with "man" > history -d n:m ^man* - delete the first m lines that begin with "man", > starting at line n. > history -d n,m ^man* - delete all occurrences of ^man* between lines n and > m. > > > -- View this message in context: http://old.nabble.com/feature-requests---bash-history-tp32008330p32190052.html Sent from the Gnu - Bash mailing list archive at Nabble.com.