Prompt-doc: Expressões Regulares

III SDSL - Lajeado, 21 de Julho de 2004

Este é o histórico da linha de comando do curso de Expressões Regulares que ministrei no III SDSL em Lajeado - RS.

As Expressões Regulares são uma simbologia, um método de se descrever padrões de texto complicados ou posicionais, como "números no final da linha" ou "palavras repetidas na mesma linha".

  • Data: 21-Jul-2004
  • Horário: 09:00
  • Duração: 7 horas
  • Local: Laboratório Univates
  • Participantes: 14 pessoas
  • Requisitos: Nenhum

Usando o cat para que a ER fique no final da linha

  $ grep root /etc/passwd
  $ cat /etc/passwd | grep root

As âncoras ^ e $ para começo e fim de linha

  $ cat /etc/passwd | grep ^root                 # root no início
  $ cat /etc/passwd | grep bash$                 # bash no fim
  $ cat /etc/passwd | grep ^$                    # linhas em branco

O ou de caracteres [] (lista)

  $ cat /etc/passwd | grep adm
  $ cat /etc/passwd | grep Adm
  $ cat /etc/passwd | grep '[Aa]dm'              # Adm ou adm
  $ cat /etc/passwd | grep '[aeiou]'             # vogais
  $ cat /etc/passwd | grep '^[aeiou]'            # vogais no início
  $ cat /etc/passwd | grep '^[aeiouAEIOU]'       # vogais minú/MAIÚ

O curinga . (ponto)

  $ cat /etc/passwd | grep '^.[aeiou]'           # vogal na segunda
  $ cat /etc/passwd | grep '^..[aeiou]'          # vogal na terceira
  $ cat /etc/passwd | grep '^....[aeiou]'        # vogal na sexta

O repetidor {} (chaves)

  $ cat /etc/passwd | grep '^.\{10\}[aeiou]'     # vogal na 10a
  $ cat /etc/passwd | egrep '^.{10}[aeiou]''     # vogal na 10a (egrep)

  $ cat /etc/passwd | egrep '[aeiou][aeiou][aeiou][aeiou]'
  $ cat /etc/passwd | egrep '[aeiou]{4}'         # repetindo listas

  $ cat /etc/passwd | egrep '^.{1,4}[aeiou]'     # de 1 a 4
  $ cat /etc/passwd | egrep '^.{0,4}[aeiou]'     # de 0 a 4
  $ cat /etc/passwd | egrep '^.{4,}[aeiou]'      # no mínimo 4

Com sistema em pt_BR, a-z casa acentos

  $ echo áéíóú | grep [a-z]                      # casa, sistema pt_BR
  $ LANG= LC_ALL= ; echo áéíóú | grep [a-z]      # não casa, sistema en

Intervalos em listas []

  $ cat /etc/passwd | egrep '^[a-z]'             # começa com letras
  $ cat /etc/passwd | egrep '^[aeiou]'           # começa com vogais
  $ cat /etc/passwd | egrep '^[b-df-hj-np-tv-z]' # começa com consoantes
  $ cat /etc/passwd | egrep '^[^aeiou]'          # começa com não vogal

Os atalhos ? * +

  $ cat txt | egrep '^a{0,1}$'                   # a 0 ou 1 vez
  $ cat txt | egrep '^a?$'                       # a 0 ou 1 vez
  $ cat txt | egrep '^a{0,}$'                    # a 0 ou mais vezes
  $ cat txt | egrep '^a*$'                       # a 0 ou mais vezes
  $ cat txt | egrep '^aa{1,}$'                   # a 1 ou mais vezes
  $ cat txt | egrep '^a+$'                       # a 1 ou mais vezes

O curinga .*, o tudo e o nada

  $ echo abc | grep a.*bc                        # .* casa nada
  $ echo a------bc | grep a.*bc                  # .* casa -------

O curinga .* é guloso

  $ echo "um negrito <b>aqui</b> e <i>aqui</i>" | sed 's/<.*>//g'
  $ echo "um negrito <b>aqui</b> e <i>aqui</i>" | sed 's/<[^>]*>//g'

O ou de palavras |

  $ cat /etc/passwd | egrep '^(root|adm|ftp)'
  $ cat /etc/passwd | egrep '^(root|adm|ftp):'
  $    #  (supermercado|hipermercado|mercado|minimercado)
  $    #  (super|hiper|mini)?mercado

Os retrovisores \1, \2 ... \9

  $     #    (quero)-\1
  $ cat numeros.txt | egrep '([0-9])\1\1'        # casa 444, 555, 777

ER para casar palavras repetidas

  $ cat txt | egrep '([a-z]+) \1'                # espaço entre palavras
  $ cat txt | egrep ' ([a-z]+) \1'               # espaço antes
  $ cat txt | egrep '(^| )([a-z]+) \2'           # espaço ou início
  $ cat txt | egrep '(^| )([a-z]+) \2( |$)'      # espaço ou final
  $ cat txt | egrep '(^| )([a-z]+) \2([ .]|$)'   # espaço ou ponto ou final
  $ cat txt | egrep '\<([a-z]+) \1\>'            # usando borda de palavra
  $ cat txt | egrep '\b([a-z]+) \1\b'            # com \b também funciona

ER de zero a 255

  $ seq 260 > numeros2.txt
  $ cat numeros2.txt | egrep '[0-9]{1,3}'
  $ cat numeros2.txt | egrep '^[0-9]{1,3}$'
  $ cat numeros2.txt | egrep '^[0-9]{1,2}$'
  $ cat numeros2.txt | egrep '^([0-9]{1,2}|1[0-9][0-9])$'
  $ cat numeros2.txt | egrep '^([0-9]{1,2}|1[0-9][0-9]|2[0-5][0-5])$'
  $ cat numeros2.txt | egrep '^([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9])$'
  $ cat numeros2.txt | egrep '^([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$'

ER para casar IP (N.N.N.N onde N de 0 a 255)

  $ cat ips | egrep '^([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.\1\.\1\.\1$'
  $ cat ips | egrep '^(([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.|$)){4}$'
  $ cat ips | sed 's/$/./' | egrep '^(([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){4}$'
  $ ### usando uma variável
  $ NUM='([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'
  $ cat ips | egrep "^($NUM\.){3}($NUM)$"
  $ ### o monstro expandido
  $ cat ips | egrep "^(([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}(([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5]))$"
  $ cat ips | egrep "\<(([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}(([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5]))\>"
— EOF —

Gostou desse texto? Aqui tem mais.