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

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

Re: [shell-script] oddwording


From: Tiago Barcellos Peczenyj
Subject: Re: [shell-script] oddwording
Date: Tue, 22 May 2007 09:37:33 -0300

usando sed + rev + xargs

oddwording(){
   sed -r 's/(\w+)\s+(\w+)/\1 $(rev <<< "\2")/g' <<< $* | xargs -i bash -c
"echo {}"
}

$ oddwording "esta eh uma frase simples de oito palavras"

esta he uma esarf simples ed oito sarvalap

como funciona ? Tcharam:

Antes de mais nada: here strings !

http://twiki.softwarelivre.org/bin/view/TWikiBar/TWikiBarBirinaite#Here_Strings

Agora, vejamos o sed simplificado, para encontrar as palavras de indice
impar a partir do 0:

$ sed -r 's/(\w+)\s+(\w+)/\1 [\2]/g' <<< "esta eh uma frase simples de oito
palavras"

esta [eh] uma [frase] simples [de] oito [palavras]

Se a primeira palavra tem indice 0 e quero destacar as palavras de índice
impar basta pegar grupos de 2 palavras e destacar a segunda. Para isso eu
uso expressoes regulares extendidas ( -r ) para encontrar grupos de 2
palavras e, na segunda palavra, eu coloco um par de parentesis em volta.
(\w+)\s+(\w+) representa um 'grupo' de "letras" (na verdade \w  são todos os
alfanumericos mais "_") um ou mais espaços em branco e outro grupo de
"letras" -- estes grupos podem ser referenciados pelo sed pelos retrovisores
\1 e \2 [1]

Certo, ja tenho as palavras que eu quero destacadas, mas eu quero
inverte-las. Para isso eu uso o rev:

$ rev <<< "algumas palavras a serem invertidas"

saditrevni meres a sarvalap samugla

certo, mas como juntar o rev dentro do sed ? Existem varias formas, a que
melhor funcionou comigo foi esta

$ sed -r 's/(\w+)\s+(\w+)/\1 $(rev <<< "\2")/g' <<< "frase a ser
oddwordingzada"

frase $(rev <<< "a") ser $(rev <<< "oddwordingzada")

ou seja, eu construo uma frase e, a cada palavra destacada, eu coloco um $(
) e o comando para inverte-la.

Para executar ? Xargs!

$ sed -r 's/(\w+)\s+(\w+)/\1 $(rev <<< "\2")/g' <<< "frase a ser
oddwordingzada" | xargs -i bash -c "echo {}"

frase a ser adazgnidrowddo

Ai bastou parametrizar em uma função ou script, conforme o primeiro exemplo
(completo).

[]´s Tiago

Notas:
[1] vejam
http://aurelio.net/curso/conectiva/conectiva-er-prompt.html#toc21para mais
exemplos


On 5/22/07, Julio C. Neves <address@hidden> wrote:
>
>   Aê Tiago,
> como aqui pouco se fala em vetores, aí vai um exemplo de seu uso:
>
> Vet=( $1 ) # Cada palavra passa a ser um
> componente do vetor Vet
> for ((i=0; i<${#Vet[@]}; i+=2)); { # Do índice zero enquanto for menor
> que o tamanho de Vet
> Vet[$i]=$(rev <<< ${Vet[$i]}); } # inverte os impares
> echo ${Vet[@]} # escreve o vetor inteiro com os
> impares invertidos
>
> Abraços,
> Julio
> :wq
>
> Em 21/05/07, Tiago Barcellos Peczenyj 
> <address@hidden<tiago.peczenyj%40gmail.com>>
> escreveu:
>
> >
> > Tem corrido por aí uma brincadeira chamada oddwording (do inglês odd
> > words, "palavras ímpares").
> >
> > A idéia é pegar uma frase, indexar as palavras a partir de zero e
> > inverter as palavras de índice ímpar.
> >
> > Depois de matutar muito, percebi que este tipo de brincadeira pode
> > exercitar muitos conceitos em shell, alem de possuir muitas possiveis
> > respostas.
> >
> > Criei uma solução usando sed + algumas gambiarras, vou postar aqui
> > mais tarde. Se alguem quiser bolar alguma forma em shell e postar (bem
> > explicado aqui) é bem vindo.
> >
> > eval '[]´s Tiago'
> > --
> > Tiago B Peczenyj
> > Linux User #405772
> >
> > # cd /pub
> > # more beer
> >
> >
>
> --
> Abraços,
> Julio
> http://www.julioneves.com - Um livro sobre Bash completo e on-line
> :wq
>
> [As partes desta mensagem que não continham texto foram removidas]
>
>  
>



-- 
Tiago B Peczenyj
Linux User #405772

# cd /pub
# more beer


[As partes desta mensagem que não continham texto foram removidas]



reply via email to

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