Busca

Visite também: UnderLinux ·  VivaOLinux ·  LinuxSecurity ·  NoticiasLinux ·  BR-Linux ·  SoftwareLivre.org ·  [mais]   
 



 

Aprenda inglês em casa

Baixe gratuitamente as duas primeiras aulas

English for Reading and Listening

Receba por email, diariamente, mensagens contendo materiais para leitura e audição, incluindo arquivos no formato MP3 gravados por falantes nativos.

Saiba mais e faça sua inscrição

você está aqui: Home  → Colunistas  →  Cantinho do Shell

 

Expansão de Chaves

Por Júlio Cezar Neves

Data de Publicação: 19 de Maio de 2008

Ainda tem gente que pensa que o Shell é a mesma coisa que o DOS... Vejam só vocês! O para nos do mundo do Software Livre é um interpretador, depois de estragado, decapitado e decepado, virou um sistema operacional que imperou desde o advento do PC até a era (r)windows.

Para ilustrar um pouco essas diferenças, mostrarei um mecanismo do Shell muito interessante, porém pouco conhecido e portanto pouco usado. Chama-se Expansão de Chaves ou Brace Expansion.

Expansão de chaves é um mecanismo pelo qual cadeias arbitrárias podem ser geradas. Este mecanismo é similar à expansão de nome de arquivos, porém os nomes de arquivos gerados não precisam existir.

A sintaxe de uma expansão de chaves é um abre chaves ({) seguido de valores separados por vírgula (,) e encerrados por um fecha chaves (}). Esta expressão poderá ser precedida ou seguida por outros valores e sua saída será na mesma ordem de entrada, isto é, não será classificada. Veja os exemplos:

  $ echo a{x,y,z}b 
  axb ayb azb 
  $ echo {B,F,M,C,P}ala 
  Bala Fala Mala Cala Pala 
  $ echo ala{meda,mbique,rde} 
  alameda alambique alarde
  $ echo p{ata,ita,eitu}da 
  patada pitada peituda 

Você também pode construir uma expansão de chaves usando dois pontos (..) para dar uma idéia de sequência. Olha só isso:

  $ echo {0..9} 
  0 1 2 3 4 5 6 7 8 9 
  $ echo {9..0} 
  9 8 7 6 5 4 3 2 1 0 
  $ echo {A..J} 
  A B C D E F G H I J 
  $ echo {j..a} 
  j i h g f e d c b a 

Há algum tempo, estava fazendo uma palestra sobre Expressões Regulares e disse: Para especificar uma lista para todas as letras do alfabeto (minúsculas e maiúsculas) usem sempre [A-Aa-z] e nunca [A-z] pois entre o Z e o a existem diversos caracteres, vejam:

  $ echo {Z..a} 
  Z [  ] ^ _ ` a 

Bem, a esta altura do campeonato, você deve estar se perguntado:

E pra quê serve isso?

Bem, quem trabalha com a cabeça não trabalha com o braço. Assim, ao invéz de fazer:

  $ mkdir /usr/local/data
  $ mkdir /usr/local/bin
  $ mkdir /usr/local/var

Você pode simplesmente fazer:

  $ mkdir /usr/local/{data,bin,var}

Ou complicando mais um pouquinho e usando expansão de arquivos:

  $ chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}} 

Bem, frequentemente sou obrigado a gerar um arquivo para fazer testes em alguns comandos. Veja como faço isso rapidinho:

  $ echo -e "\nLinha "{1..12} > arq.teste 
  $ cat arq .teste
  
  Linha 1 
  Linha 2 
  Linha 3 
  Linha 4 
  Linha 5 
  Linha 6 
  Linha 7 
  Linha 8 
  Linha 9 
  Linha 10 
  Linha 11 
  Linha 12 

Vamos complicar um pouquinho para pegar todos os binários entre 0 e 15:

  $ A={0,1}
  $ eval echo $A$A$A$A
  0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111

Um último exemplo e um desafio:

  $ a={A,C,S} 
  $ eval echo $a$a$a$a 
aaaa aaac aaas aaca aacc aacs aasa aasc aass acaa acac acas acca accc accs acsa acsc acss asaa asac asas asca ascc ascs assa assc asss caaa caac caas caca cacc cacs casa casc cass ccaa ccac ccas ccca cccc cccs ccsa ccsc ccss csaa csac csas csca cscc cscs cssa cssc csss saaa saac saas saca sacc sacs sasa sasc sass scaa scac scas scca sccc sccs scsa scsc scss ssaa ssac ssas ssca sscc sscs sssa sssc ssss

Repare que as instruções acima geraram todas as palavras de quatro letras, possíveis de escrever com as letras c, a e s. Repare ainda que coloquei em negrito as palavras válidas na língua portuguesa (válidas pelo menos para mim) ;). O dicionário ispell que existe em modo texto, pode filtra a saída do comando, deixando somente as válidas.

O desafio é o seguinte: pago o chope para aquele que mandar para o meu e-mail (julioneves-(@)-openoffice-(.)-org. Um scriptzinho para resolver logomania. Logomania é um jogo que aparece diariamente em um monte de jornais, onde te dão algumas letras e vence quem fizer o maior número de palavras válidas com aquelas letras.

Bem, há um bom tempo não escrevia nada para o nosso Cantinho do Shell, espero em breve escrever sobre o glob, que é um intrínseco (built-in) do Shell e incrementa as facilidades oferecidas pela técnica de expansão de arquivos.

Se você, amigo, conhecer alguma dessas peculiaridades pouco exploradas do Bash, mande seu artigo para cá que ele será publicado.

Versão para impressão
  • Currently 3.30/5
  • 1
  • 2
  • 3
  • 4
  • 5

Avaliação: 3.3 /5 (218 votos)

Artigos Publicados


Linux Shell Script em Newsgroup

Servidor: news.gmane.org

Grupo: gmane.org.user-groups.programming.shell.brazil


Para se manter atualizado sobre as novidades desta coluna, consulte sempre o newsfeed RSS

Cantinho do Shell NewsFeed RSS

Para saber mais sobre RSS, leia o artigo O Padrão RSS - A luz no fim do túnel.


Opinião dos Leitores

Silvio Palmieri
23 Mai 2008, 11:52
como usar e um problema de cada um, mas o Julio ensina e como pescar e não dar o peixe.

usando as palavras do Raul:

mestre é mestre....

sempre.

Que a força esteja com vcs, pois o mestre jedi esta de volta

e nós como humildes Padawans apreendemos com o Grão Mestre

O Código Jedi
Não há emoção, há paz.
Não há ignorância, há conhecimento.
Não há paixão, há serenidade.
Nao há caos, há harmonia.
Não há morte, há a Força.
Silvio Palmieri
23 Mai 2008, 11:45
ficou muito feliz por ver o mestre do shell script voltando a nos contemplar com sua sabedoria.
Samuel Félix
20 Mai 2008, 16:46
Fala Julio,
gostei do seu artigo, cara...
soh uma pequena correção, eu naum disse que deveria ter usado POSIX, e sim, que *poderia* usar, demonstrei isso soh para que outros leitores vissem uma outra forma de fazer o q vc fez... ok?
Abraços,
Samuel Félix
Ja que usas o vi, eu uso o nano =)
^O
^X
Ivan
20 Mai 2008, 13:07
por favor me esclareçam uma coisa:

Qual a relação do shell e dos

Sei que o MS-Dos veio do Q-Dos
Tanto que reza a lenda que o criador desse sistema disse "eu inventei o CRTL + ALT +DEL mas foi o bill que o popularizou"
Fábio
20 Mai 2008, 12:33
Ótima!!!!!!!!!
Julio Neves
20 Mai 2008, 12:16
Fala Samuel Felix,
vc tem razão e ao mesmo tempo vc não tem razão. A grande vantagem da lista [[:alpha:]] sobre [A-Za-z] é que a primeira aceita todos os caracteres especificados na variável $LANG e, assim sendo, aceita letras acentuadas no caso de LANG=pt_BR.
O problema é que nem todas as instruções aceitam listas com POSIX.
Vc está errado qdo me disse que eu deveria ter usado POSIX. No enunciado, disse que estava fazendo uma palestra e assim sendo, teria de mostrar tanto da forma careta qto o POSIX e é isso que faço. Porém como é comum vermos [A-z], usei o artifício para mostrar que existem diversos caracteres ASCII entre o "Z" e o "a".
Por favor não me diga que eu deveria ter feito mas ascii... ;)

Abraços,
Julio
:wq
Gleison
20 Mai 2008, 11:26
Muito bem...
não conhecia estes recursos...
Samuel Félix
20 Mai 2008, 11:24
Bom, acho que para validar apenas palavras, poderia usar algo como [[:alpha:]], ao invés de [A-Za-z],
tipo:

expr "asdfASDF" : '[[:alpha:]]*'

que valida tanto maisculas quanto minusculas =D
Márcia
20 Mai 2008, 11:19
Ótima! Muito útil mesmo!
marlon petry
20 Mai 2008, 10:38
Muito bom mesmo.

Já precisei deste recurso mas não sabia que existia.

Parabéns ótima dica.

http://petryx.blogrs.com.br
Fabiel
20 Mai 2008, 08:37
Muito bom...
Isso é uma mão na roda.
Falou valeu!
Andre Guerra
20 Mai 2008, 08:09
Muito boa dica, aliás como todas as dicas do Júlio.

Parabéns!
Raul Libório
20 Mai 2008, 00:18
Mestre é mestre...

Parabéns Júlio, ótima dica ;)
*Nome:
Email:
Me notifique sobre novos comentários nessa pagina
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script

Recomende este site
Recomendar este artigo