My favorites | Sign in
Project Home Downloads Wiki Issues Source
Checkout   Browse   Changes    
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# ----------------------------------------------------------------------------
# Mostra a diferença entre dois textos, palavra por palavra.
# Útil para conferir revisões ortográficas ou mudanças pequenas em frases.
# Obs.: Se tiver muitas *linhas* diferentes, use o comando diff.
# Uso: zzdiffpalavra arquivo1 arquivo2
# Ex.: zzdiffpalavra texto-orig.txt texto-novo.txt
#
# Autor: Aurelio Marinho Jargas, www.aurelio.net
# Desde: 2001-07-23
# Licença: GPL
# ----------------------------------------------------------------------------
zzdiffpalavra ()
{
zzzz -h diffpalavra "$1" && return

local esc
local tmp1="$ZZTMP.diffpalavra.1.$$"
local tmp2="$ZZTMP.diffpalavra.2.$$"
local n=$(printf '\a')

# Verificação dos parâmetros
[ $# -ne 2 ] && { zztool uso diffpalavra; return 1; }

# Verifica se os arquivos existem
zztool arquivo_legivel "$1" || return
zztool arquivo_legivel "$2" || return

# Deixa uma palavra por linha e marca o início de parágrafos
sed "s/^[[:blank:]]*$/$n$n/;" "$1" | tr ' ' '\n' > "$tmp1"
sed "s/^[[:blank:]]*$/$n$n/;" "$2" | tr ' ' '\n' > "$tmp2"

# Usa o diff para comparar as diferenças e formata a saída,
# agrupando as palavras para facilitar a leitura do resultado
diff -U 100 "$tmp1" "$tmp2" |
sed 's/^ /=/' |
sed '
# Script para agrupar linhas consecutivas de um mesmo tipo.
# O tipo da linha é o seu primeiro caractere. Ele não pode
# ser um espaço em branco.
# +um
# +dois
# .one
# .two
# vira:
# +um dois
# .one two

# Apaga os cabeçalhos do diff
1,3 d

:join

# Junta linhas consecutivas do mesmo tipo
N

# O espaço em branco é o separador
s/\n/ /

# A linha atual é do mesmo tipo da anterior?
/^\(.\).* \1[^ ]*$/ {

# Se for a última linha, mostra tudo e sai
$ s/ ./ /g
$ q

# Caso contrário continua juntando...
b join
}
# Opa, linha diferente (antiga \n antiga \n ... \n nova)

# Salva uma cópia completa
h

# Apaga a última linha (nova) e mostra as anteriores
s/\(.*\) [^ ]*$/\1/
s/ ./ /g
p

# Volta a cópia, apaga linhas antigas e começa de novo
g
s/.* //
$ !b join
# Mas se for a última linha, acabamos por aqui' |
sed 's/^=/ /' |

# Restaura os parágrafos
tr "$n" '\n' |

# Podemos mostrar cores?
if [ "$ZZCOR" = 1 ]
then
# Pinta as linhas antigas de vermelho e as novas de azul
esc=$(printf '\033')
sed "
s/^-.*/$esc[31;1m&$esc[m/
s/^+.*/$esc[36;1m&$esc[m/"
else
# Sem cores? Que chato. Só mostra então.
cat -
fi

rm -f "$tmp1" "$tmp2"
}

Change log

r710 by aureliojargas on Mar 29, 2012   Diff
SEGURANÇA: $1 colocado entre aspas na
chamada padrão zzzz -h de todas as
funções.
Go to: 
Sign in to write a code review

Older revisions

r668 by aureliojargas on Mar 28, 2012   Diff
lint: removendo espaços inúteis.
r655 by aureliojargas on Mar 23, 2012   Diff
s/Aurélio/Aurelio/ *
r524 by aureliojargas on May 23, 2011   Diff
COMBO: Agora todas as chamadas ao
zztool uso por falha na verificação
dos parâmetros possuem um return 1
depois. Assim outros scripts que usam
as funções podem detectar erros.
All revisions of this file

File info

Size: 2612 bytes, 103 lines
Powered by Google Project Hosting