#!/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