Expressões regulares Expressão regular é um

Transcrição

Expressões regulares Expressão regular é um
Expressões regulares
Expressão regular é um conjunto de expressões que funcionam de forma semelhante as expressões
aritméticas, utilizando operadores para fazer combinações com expressões menores.
Existem dois tipos de expressões regulares:
• Simples - utiliza os caracteres numéricos e os caracteres: *, ., ^, $, e [ ].
• Estendidas - utiliza os caracteres numéricos e os caracteres: *, ., ?, +, ^, $, {, }, [, ], (, ), |, \< e \>.
Abaixo segue a tabela dos metacaracteres utilizados nas expressões regulares.
Metacaractere
Nome
Posição
^
circunflexo
Indica o começo de linha
$
cifrão
Indica o final de linha
Texto
[abc]
lista
Encontra ocorrências com as letras a ou b ou c
[a-z]
lista
Encontra ocorrências com as letras de a à z
[^abc]
(abc|aeiou)
lista de negação Encontra ocorrências que não tenham as letras de a, b e c
ou
Encontra ocorrências que tenham as letras de a, b e c ou as
vogais aeiou
Quantidade
a{3}
chaves
Combina a letra a três vezes
a{1,3}
chaves
Combina a letra a de 1 à 3 vezes
a{3,}
chaves
Combina a letra a no mínimo três vezes
Quantidade
a?
opcional
Combina a letra a zero ou uma vez
a*
asterisco
Combina a letra a zero ou mais vezes
a+
mais
Combina a letra a uma ou mais vezes
Curingas
.
ponto
Encontra qualquer caractere
.*
curinga
Encontra qualquer coisa
1
As expressões regulares são utilizadas no shell do Linux através dos comandos de
filtragem grep, egrep, fgrep e sed e pelas linguagens awk, perl e etc.
Através de expressões regulares, podemos filtrar ou validar textos como: data e horário, endereço IP,
endereço de email, RG, CPF, Cep, telefone, dados de uma coluna ou linha de um texto, etc.
Para mostrar os exemplos abaixo, usaremos o comando grep, o arquivo /etc/passwd e criaremos os
arquivos palavras.txt, letras.txt e numeros.txt.
$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
Debian-exim:x:100:102::/var/spool/exim4:/bin/false
statd:x:101:65534::/var/lib/nfs:/bin/false
identd:x:102:65534::/var/run/identd:/bin/false
messagebus:x:103:104::/var/run/dbus:/bin/false
avahi:x:104:105:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/bin/false
haldaemon:x:105:108:Hardware abstraction layer,,,:/home/haldaemon:/bin/false
postgres:x:106:112:PostgreSQL administrator,,,:/var/lib/postgresql:/bin/bash
gdm:x:107:113:Gnome Display Manager:/var/lib/gdm:/bin/false
hplip:x:108:7:HPLIP system user,,,:/var/run/hplip:/bin/false
aluno1:x:1000:1000:aluno1,,,:/home/aluno1:/bin/bash
sshd:x:109:65534::/var/run/sshd:/usr/sbin/nologin
mysql:x:110:115:MySQL Server,,,:/var/lib/mysql:/bin/false
2
oracle:x:1003:1003::/usr/lib/oracle/xe:/bin/bash
bind:x:111:116::/var/cache/bind:/bin/false
$ cat > palavras.txt
Linux
Linus Tovalds
O criador do Linux
Seja livre use Linux
linux
liberdade
alunos
Projeto Linux Brasil
Aperte ENTER
Aperte CTRL+D
O circunflexo ^
Video exemplo
O caractere circunflexo representa um texto no inicio da linha.
Exemplos:
$ grep Linux palavras.txt
Linux
O criador do Linux
No exemplo acima, retornam todas as ocorrências da palavra Linux.
$ grep ^Linux palavras.txt
Linux
Agora, colocando o ^circunflexo, retorna apenas a primeira linha que começa com a palavra Linux. Você
também pode especificar a string com o caractere dentro de aspas simples ou duplas.
$ grep '^Linux' palavras.txt
3
$ grep "^Linux" palavras.txt
O cifrão $
Video exemplo
O caractere cifrão representa um texto no final da linha.
Exemplo:
$ grep /bin/bash$ /etc/passwd
root:x:0:0:root:/root:/bin/bash
aluno1:x:1000:1000:aluno1,,,:/home/aluno1:/bin/bash
O colchete [ ]
Video exemplo
O colchete ou lista, representa um intervalo de caracteres especificados dentro dos colchetes, podendo
ser números ou letras, por exemplo os números de 0 à 9 [0-9] e as letras de a à z [a-z], veja o exemplo
abaixo:
Exemplos:
Retornam somente as palavras Linux em maiúsculo
$ grep 'Linux' palavras.txt
Retornam somente as palavras linux em minúsculo
$ grep 'linux' palavras.txt
Neste caso, usaremos o colchete usando a letra L maiúsculo e l minúsculo entre colchete [Ll] para
retornar tanto as palavras Linux em maiúsculo e linux em minúsculo.
$ grep '[Ll]inux' palavras.txt
4
O ponto .
Video exemplo
O caractere ponto, representa qualquer letra, ou seja, qualquer caractere em uma determinada posição,
podendo ser também um número, um símbolo, um espaço, um TAB, ou seja, qualquer caractere.
Exemplos:
$ cat palavras.txt
Linux
Linus Tovalds
O criador do Linux
Seja livre use Linux
linux
liberdade
alunos
Projeto Linux Brasil
No exemplo abaixo retorna somente qualquer caractere a partir do começo da linha que vem seguido de
uma vogal, repare que não retornam as frases "Projeto Linux Brasil" e "O criador do Linux", pois a letra P
de "Projeto Linux Brasil" e a letra O de "O criador de Linux" não vem seguidas de uma vogal.
Abaixo é exibido qualquer caractere seguido de uma vogal.
$ grep '^.[aeiou]' palavras.txt
Linux
Linus Tovalds
Seja livre use Linux
linux
liberdade
Neste exemplo, retornam apenas as palavras com qualquer caractere, vem seguido das letras inu e que
termina com x.
$ grep '^.[inu]*x' palavras.txt
Linux
linux
Outro exemplo semelhante ao citado acima, é você usar o ponto para procurar tamanho fixo de uma string,
sem depender de seu conteúdo.
No exemplo abaixo, retornam apenas as palavras que tem 5 caracteres, onde ^ é o início da linha e $ é o
fim da linha.
5
$ grep '^.....$' palavras.txt
Linux
linux
As chaves { }
Video exemplo
Um número dentro de chaves representa a quantidade de repetições do caractere anterior.
Exemplos:
Este exemplo é semelhante ao anterior, especificando o número de caracteres e não pontos. Observe que
foi usado o comando egrep e não grep, pois as chaves { } fazem parte das expressões regulares
estendidas (avançadas).
$ egrep '^.{5}$' palavras.txt
Linux
linux
Para usar o grep teríamos que colocar a \ barra invertida antes das chaves, por isso, é mais fácil usar o
egrep nestes casos.
$ grep '^.\{5\}$' palavras.txt
Linux
linux
As chaves aceitam um intervalo especificando uma faixa de repetições com um valor mínimo e máximo.
No exemplo abaixo, retornam as linhas que tenham entre 5 e 9 caracteres.
$ egrep '^.{5,9}$' palavras.txt
Linux
linux
liberdade
alunos
Caso você não especifique o segundo número e mantenha a vírgula, ficará uma faixa infinita de
caracteres.
No exemplo abaixo, serão exibidas as linhas que têm 9 ou mais caracteres.
6
$ egrep '^.{9,}$' palavras.txt
Linus Tovalds
O criador do Linux
Seja livre use Linux
liberdade
Projeto Linux Brasil
Este exemplo abaixo, retorna todos os usuários que possuem o UID ou GID maior que 4 caracteres
numéricos de 0 à 9 [0-9].
$ egrep '[0-9]{4,}' /etc/passwd
sync:x:4:65534:sync:/bin:/bin/sync
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
statd:x:101:65534::/var/lib/nfs:/bin/false
identd:x:102:65534::/var/run/identd:/bin/false
aluno1:x:1000:1000:aluno1,,,:/home/aluno1:/bin/bash
sshd:x:109:65534::/var/run/sshd:/usr/sbin/nologin
oracle:x:1003:1003::/usr/lib/oracle/xe:/bin/bash
O curinga .* (ponto asterístico) (AND)
Video exemplo
O caractere .* ponto asterisco representa qualquer coisa, inclusive, nada entre partes de uma linha não
importando o que há de conteúdo. O .* (AND) funciona de forma semelhante a um AND lógico em
linguagens de programação, ou seja, somente exibe o resultado da pesquisa se encontrar ambas as
partes da pesquisa.
Exemplos:
Neste exemplo são exibidos os usuários que começam com letras de a à z [a-z] e terminam com a
palavra bash.
$ egrep '^[a-z].*bash$' /etc/passwd
root:x:0:0:root:/root:/bin/bash
postgres:x:106:112:PostgreSQL administrator,,,:/var/lib/postgresql:/bin/bash
aluno1:x:1000:1000:aluno1,,,:/home/aluno1:/bin/bash
oracle:x:1003:1003::/usr/lib/oracle/xe:/bin/bash
7
O or | (barra em pé) (OR)
Video exemplo
O caractere pipe | barra em pé representa em uma pesquisa para procurar uma coisa ou outra. O | (OR)
deve ser usado dentro de parênteses ( ) e funciona de forma semelhante a um OR lógico em linguagens
de programação, ou seja, exibe o resultado da pesquisa se encontrar uma das partes da pesquisa.
Exemplos:
Neste exemplo são exibidos as palavras que começam com palavras Linux ou linux ou Linus.
$ egrep '^(Linux|linux|Linus)' palavras.txt
Linux
Linus Tovalds
linux
Os repetidores ? + *
Os caracteres interrogação (chamado de opcional), o mais e o asterisco são repetidores que
especificam a quantidade e funcionam como as chaves { }.
Caractere
Nome
Equivale
Significado
?
opcional
{0,1}
Aparece ou não (opcional)
+
mais
{1,}
Aparece no mínimo uma vez
*
asterisco
{0,}
Aparece em qualquer quantidade
Lista de negação [^]
Video exemplo
Podemos especificar o caractere circunflexo dentro de colchetes para negar uma expressão.
Exemplos:
No exemplo abaixo são mostradas as linhas que não começam com vogais, repare que a palavra alunos
não é exibida, pois começa com vogal.
8
$ cat palavras.txt
Linux
Linus Tovalds
O criador do Linux
Seja livre use Linux
linux
liberdade
Projeto Linux Brasil
alunos
$ grep '^[^aeiou]' palavras.txt
Linux
Linus Tovalds
O criador do Linux
Seja livre use Linux
linux
liberdade
Projeto Linux Brasil
Intervalo de lista [-]
Video exemplo
Podemos especificar um hífen dentro de colchetes, para indicar um intervalo entre duas letras que será
estendido para todas as letras dentro do intervalo. Por exemplo [a-f] quer dizer para retornar todas as
letras no intervalo de a à f [abcdef] ou [0-9] para retorna todos os números de 0 à 9 [0123456789].
Exemplos:
No exemplo abaixo são mostradas as linhas que estão no intervalo de a à f.
$ cat > letras.txt
abcdefghij
defabc
abcdef
rpzstq
xwzkwmp
Aperte ENTER
Aperte CTRL+D
9
$ egrep '[a-f]' letras.txt
abcdefghij
defabc
abcdef
Neste exemplo abaixo, exibimos somente as linhas com as letras que não estão no intervalo de [a-f],
repare que é exibida a linha com as letras de [abcdefghij], pois as letras ghij estão fora do intervalo de
[a-f].
$ egrep '[^a-f]' letras.txt
abcdefghij
rpzstq
xwzkwmp
Neste exemplo abaixo, exibimos somente as linhas com os números que começam com 1 (102, 15 e 111)
e que tenha 3 dígitos {0,1,2} Ex: 102 e 111 .
$ cat > numeros.txt
102
15
9
111
1024
10555
Aperte ENTER
Aperte CTRL+D
$ egrep '^1[0-9]{0,2}$' numeros.txt
102
15
111
ou com grep usando escape nas chaves com barra invertida \.
$ grep '^1[0-9]\{0,2\}$' numeros.txt
102
15
111
10

Documentos relacionados

O que compõem um usuário # /etc/passwd

O que compõem um usuário # /etc/passwd mail:x:8:8:mail:/var/mail:/bin/sh news:x:9:9:news:/var/spool/news:/bin/sh uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh proxy:x:13:13:proxy:/bin:/bin/sh www-data:x:33:33:www-data:/var/www:/bin/sh back...

Leia mais

CGPE/SE-MC - dgo..:::cefet-mg

CGPE/SE-MC - dgo..:::cefet-mg faz distinção entre os caracteres maiúsculos e minúsculos. Portanto, para o Unix/Linux, Ls é diferente de ls. Quase sempre as opções dos comandos são precedidas pelo caractere “-” (menos) o...

Leia mais