#!/bin/bash

# Skrypt cgrep wyświetlający kontekst i wyróżniający wyszukane fragmenty tekstu.

context=0
esc="^["
boldon="${esc}[1m" boldoff="${esc}[22m"
sedscript="/tmp/cgrep.sed.$$"
tempout="/tmp/cgrep.$$"

function showMatches
{
  matches=0

  echo "s/$pattern/${boldon}$pattern${boldoff}/g" > $sedscript

  for lineno in $(grep -n "$pattern" $1 | cut -d: -f1)
  do 
    if [ $context -gt 0 ] ; then
      prev="$(( $lineno - $context ))"

      if [ $prev -lt 1 ] ; then
         # Ten wynik powoduje wyświetlenie komunikatu o niewłaściwym użyciu
         # wiersza o adresie 0.
        prev="1"
      fi
      next="$(( $lineno + $context ))"

      if [ $matches -gt 0 ] ; then
        echo "${prev}i\\" >> $sedscript
        echo "----" >> $sedscript
      fi
      echo "${prev},${next}p" >> $sedscript
    else
      echo "${lineno}p" >> $sedscript
    fi
    matches="$(( $matches + 1 ))"
  done

  if [ $matches -gt 0 ] ; then
    sed -n -f $sedscript $1 | uniq | more
  fi
}

trap "$(which rm) -f $tempout $sedscript" EXIT 

if [ -z "$1" ] ; then
  echo "Użycie: $0 [-c X] wzorzec {nazwa_pliku}" >&2; exit 0
fi

if [ "$1" = "-c" ] ; then
  context="$2"
  shift; shift
elif [ "$(echo $1|cut -c1-2)" = "-c" ] ; then
  context="$(echo $1 | cut -c3-)"
  shift
fi

pattern="$1";  shift

if [ $# -gt 0 ] ; then
  for filename ; do 
    echo "----- $filename -----"
    showMatches $filename
  done
else
  cat - > $tempout      # Zapisanie strumienia w pliku tymczasowym.
  showMatches $tempout
fi

exit 0
