shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

metaprogramação em shell


From: Tiago Barcellos Peczenyj
Subject: metaprogramação em shell
Date: Tue, 28 Aug 2007 15:14:07 -0300

criar um programa que cria programas é simples nas linguagens interpretadas.

criamos o programa em uma string e executamos via eval() ou então
gravamos em arquivo e executamos novamente.

Me deparei com o seguinte problema. Inverter as palavras de uma frase
ou arquivo *mantendo* a ordem em que aparecem.

É claro que eu pensei em usar o rev, mas ele inverte a linha como um
todo. Depois de fazer um for muito feio em awk, fiquei pensando em
como resolver.

Tive esta ideia: Vou fazer uma lista de palavras, inverte-las com o
rev e, para cada palavra, vou substitui-la pela palavra invertida.
Beleza, o sed faz isso com um pé nas costas.

Eu tenho um arquivo (poderia ser um named pipe) chamado 'direito' que
contem uma lista de palavras sem repetição, com uma palavra por linha.
outro arquivo, com o mesmo conteudo mas revertido via 'rev'.

uso o paste para colocar os arquivo lado a lado e uso o awk para gerar
comandos como este

s/\bpalavra\b/palavra_revertida/g;

usei o awk pq a sintaxe fica mais clara, o sed ficou muito poluido.

agora vem o pulo do gato: mando estes comandos via stdin para o sed,
fazendo uso de um pipe. eu informo para o sed que os comandos virão
pela stdin fazendo -f -

Vejam o resultado abaixo, espero que seja util para alguem :)

Ps: Julio, que tal chamar isso de "Inversor do Tiago"?

$ cat stuff
Nosso fórum principal.

Problemas com hardware em geral,

temperaturas, comparação de desempenho,

compatibilidades de componentes, etc.

$  LC_ALL=pt_BR grep -oE '\w+' stuff | sort -u | tee direito | rev > reverso

$  paste direito reverso | awk '{printf "s/\\b%s\\b/%s/g\n",$1,$2}' |
sed -f - stuff
ossoN muróf lapicnirp.

samelborP moc erawdrah me lareg,

sarutarepmet, oãçarapmoc ed ohnepmesed,

sedadilibitapmoc ed setnenopmoc, cte.

-- 
Tiago B Peczenyj
Linux User #405772

http://peczenyj.blogspot.com/


reply via email to

[Prev in Thread] Current Thread [Next in Thread]