#!/bin/sed -nf
#
# ae pessoal,
#
# estes dias precisei fazer um script para contar quantas vezes uma
# determinada palavra aparecia em um texto. que eu saiba não tem nenhum
# comando UNIX que te mostre isto, ou tem ?!. assim fiz um script. minha
# primeira idéia foi este script.
#
# cat file | sed -n \
# /\b'"$1"'\b/{s/\b'"$1"'\b/¡/g;s/[^¡]//g;H;};${x;:a;s/\n//;ta;s/^[^¡]*\([¡]*\).$/\1/p;}'|
# wc -c
#
# ou seja, substituimos a palavra por um caractere maluco, e adicionamos ele
# no reserva. quando chegamos ao final do arquivo, pegamos do reserva,
# deixamos só os caracteres maluco e contamos quantas vezes ele aparece (wc -c)
#
# Bom, funciona blz. mas após uma pesquisada na rede, descobri uma maneira de
# incrementar um número usando substituição muito mais simples que alguns
# métodos mirabolantes para fazer isto em sed que encontramos por aí :). 
# Então fiz este script para contar quantas vezes uma determinada palavra 
# aparece em um texto usando só sed.


# se for a primeira linha zeramos o contador.
# o contador fica sempre no reserva
1 {
  x
  s/^/0/
  x
}  

# se for a palavra que procuramos fizemos
/\bsed\b/ {
  : c
  s/\bsed\b//
  t a
  # substituimos a palavra por nada, se ocorreu sucesso na substituição
  # pulamos pro label a, senão, vamos pro label b
  b b
  # chegamos aqui se ocorreu sucesso na substituição. Assim pegamos o valor
  # que esta no reserva e fizemos valor + 1
  : a
  x
  # aqui comeca o algoritmo pra incrementar o numero
  : p
  s/9\(_*\)$/_\1/
  t p
  s/^\(_*\)$/0\1/
  s/ \(_*\)$/0\1/
  s/8\(_*\)$/9\1/
  s/7\(_*\)$/8\1/
  s/6\(_*\)$/7\1/
  s/5\(_*\)$/6\1/
  s/4\(_*\)$/5\1/
  s/3\(_*\)$/4\1/
  s/2\(_*\)$/3\1/
  s/1\(_*\)$/2\1/
  s/0\(_*\)$/1\1/
  s/_/0/g
  # como a palavra pode aparecer mais de 1x na mesma linha, pulamos pro label
  # c pra ver se existe mais
  x
  t c
  # aqui termina o algoritmo
}  
: b
# se for última linha, imprime o que tem no reserva (o contador)
$ {
  x
  p
}  

#Note que estamos usando borda no script (\b), assim se
#procurarmos por sed e tiver sedsed, o resultado vai ser 0
#testando...
#
# $ echo xxxx | ./count.sed
# 0
# $ echo sedxxxx | ./count.sed
# 0
# $ echo xxx sed yyy | ./count.sed
# 1
# $ echo -e "xxx sed yyy sed \n ttt sed" | ./count.sed
# 3
#
# PS: o link pro doc:
# http://sed.sf.net/grabbag/scripts/incr_num.sed

### colorized by sedsed, a sed script debugger/indenter/tokenizer/HTMLizer