Ficha id: pl2015-f1

Processamento de Linguagens (LEI - 3ºano)

Este ficha prática contem exercícios para serem resolvidos nas aulas teórico-práticas com vista a sedimentar os conhecimentos relativos a:

  • Motivação para o uso de Expresses Regulares (ERs) como forma de especificar padrões a pesquisar em textos - recurso a utilitários de Linux que seguem essa abordagem;
  • Uso de Expressões Regulares para definir (gerar) Linguagens Regulares;
  • Uso de Expressões Regulares para desenvolver programas eficientes, baseados em algoritmos standard guiados por Autómatos Finitos Deterministas, para reconhecer Linguagens Regulares;
  • Uso de Autómatos Deterministas Reactivos, para processar Linguagens Regulares, isto é, para desencadear ações específicas ao reconhecer frases que derivam de padrões (definidos com base em ERs) - princípio da Programação baseada em regras Condição-Reação, Sistemas de Produção;
  • Geração automática de programas a partir de especificações formais;
  • Uso das ferramentas como o grep, o gawk e o flex, disponíveis em ambiente Linux, para processamento de linguagens regulares, nomeadamente para criação de Filtros de Texto em geral.

Recursos:

Recursos disponíveis para a realização da ficha:

Exercícios:

  1. Pesquisa de Padrões em Texto
  2. Desenvolvimento de filtros de texto com o gawk: pltesteER.txt
  3. Desenvolvimento de filtros de texto com o gawk: inscritos.txt
  4. Desenvolvimento de filtros de texto com o gawk: processos.txt
  5. Desenvolvimento de filtros de texto com o gawk: arq-son.txt

Exercício Nº 1: Pesquisa de Padrões em Texto

Invoque o comando egrep:

egrep PADRAO pltesteER.txt
primeiro, para ver o resultado de usar os padrões descritos pelas ER seguintes:
      "pedro"
      "[Pp]edro"
      "[Pp]edro|[Dd][Aa]niela"
      "[Pp]edro|[Dd][Aa][a-zA-Z]+"
      "[Pp]edro|[Dd][Aa][a-zA-Z]*"
      "[Dd][Aa]?[a-zA-Z]*"
e depois, para procurar em "pltesteER.txt":
  • todas as linhas com a marca concreta 'HTML' e só essas linhas; incluia também a marca de fecho '/HTML'; note que a marca 'HTML' ou 'html' devem ser ambas encontradas;
  • todas as linhas com qualquer marca do dialeto HTML (palavra entre os sinais '<' e '>'); altere a sua procura de modo a encontrar também as marcas que contêm atributos além do nome do elemento;
  • todas as linhas com a palavra 'linha' encostadas ao início de uma linha; só as que contenham 'linha' sem ser no início da linha;
  • todas as linhas terminadas em '1' (o algarismo um no fim da linha);
  • todas as linhas que contenham números; imponha que os números tenham 2 ou mais dígitos;
  • por fim, procure todas as linhas que contenham os sinais de pontuação ':' ou ';' em todos os ficheiros de texto da sua diretoria de trabalho.

Exercício Nº 2: Desenvolvimento de filtros de texto com o gawk: pltesteER.txt

Para introduzir a ferramenta AWK (sistema baseado num conjunto de regras 'Condição-Ação'), uma linguagem de programação para deteção de padrões e processamento de texto, mais o respetivo interpretador - criado em 1977 pelos cientistas Alfred Aho, Peter J. Weinberger e Brian Kernighan no Bell Labs - execute os comandos abaixo e analise com cuidado o seu resultado:

  gawk '{ print $1 }' utilizadores.txt
  gawk '{ print $1 }' pltesteER.txt
  gawk '{ print $2 }' pltesteER.txt
  gawk -F: '{ print $1 }' utilizadores.txt
  gawk -F: '{ print $3 }' utilizadores.txt
  gawk -F: '$1=="prh" { print $1 "->" $6 }' utilizadores.txt
  gawk -F: '$1=="prh"||$1=="jcr" { print }' utilizadores.txt
e depois disso execute repetidamente o comando:
  gawk -f FILE.gawk utilizadores.txt
em que FILE vai sendo 'expusers1' e 'expusers2', observando com cuidado o resultado produzido em cada caso, sendo:

  expusers1.gawk
      BEGIN             { FS=":"; conta=0 }
      NR==1             { print "A processar o ficheiro: " FILENAME }
      NR>=1 && NR<=10   { print $1 }
      { conta+=NF }
      END               { print conta " - " NR  }
                    
  expusers2.gawk
      BEGIN              { FS=":"; conta=0 }
      /rita/             { conta++; print $1 " -> " $6 }
      /prh|jcr/          { conta++; print $1 " -> " $6 }
      /uucp/,/rpm/       { conta++; print }
      /x.*sbin/ && $3>40 { conta++; print "Em sbin: " $0 }
      $1 ~ "nuno"        { conta++; print $1 " = " $NF }
      END                { print conta " - " NR " = " conta/NR }</codigo>
                

Com base nos exemplos anteriores, escreva um ficheiro 'exppltesteER.gawk' para processar o ficheiro de texto 'pltesteER.txt' conforme os requisitos solicitados nas alíneas seguintes:

  1. contar todas as linhas começadas pela palavra 'linha';
  2. contar todas as linhas que contenham marcas HTML (só de abertura e depois de abertura e fecho), imprimindo a respetiva linha;
  3. detetar todas as linhas que tenham ancoras HTML (marcas '<A' com atributo 'HREF') e imprimir o respetivo URL;
  4. detetar todas as linhas que tenham ancoras HTML e imprimir o respetivo texto associado.

Exercício Nº 3: Desenvolvimento de filtros de texto com o gawk: inscritos.txt

Faça um exercício semelhante ao anterior, construindo agora um ficheiro 'expinscr.gawk' para processar o texto 'inscritos.txt' conforme solicitado nas alíneas seguintes:

  1. imprimir o nome e o email dos concorrentes inscritos entre a 5ª e a 15ª posições;
  2. imprimir o nome dos concorrentes que se inscrevem como 'Individuais' e são de 'Valongo';
  3. imprimir o telemóvel e a prova em que está inscrito cada concorrente cujo nome seja 'Paulo' ou 'Ricardo' e cuja operadora seja a Vodafone;
  4. imprimir os 20 primeiros registos com os nomes convertidos para minúsculas.

Exercício Nº 4: Desenvolvimento de filtros de texto com o gawk: processos.txt

Neste exercício vais calcular algumas frequências de alguns elementos, a ideia é utilisares arrays associativos para o efeito.

  1. Calcula a frequência de processos por ano (primeiro elemento da data);
  2. Calcula a frequência de nomes (considera um nome uma palavra e propaga o cálculo por todos os campos que contenham nomes);
  3. Calcula a frequência dos vários tipos de relação: irmão, sobrinho, etc.

Exercício Nº 5: Desenvolvimento de filtros de texto com o gawk: arq-son.txt

Especifica scripts em awk para responder às seguintes questões:

  1. Quais os títulos das canções alentejanas?
  2. Quantas músicas estão catalogadas por distrito/área geográfica?
  3. Quais os títulos das músicas com áudio disponível em MP3?
  4. Quais os títulos das músicas e quantas são que têm a palavra 'Jesus' no título?