Como usar expressões regulares no Linux

Por Felipe Arruda

Quase todos os tutoriais sobre Linux que apareceram no Canaltech apresentaram softwares ou comandos "indispensáveis" aos usuários e administradores de sistema. Este será um pouco diferente: as expressões regulares, de certo modo, são dispensáveis. Porém, saber usá-las é que diferenciará qualquer expert em Linux daqueles que "nunca serão".

Sendo assim, vale a pena começar o nosso treinamento de "caveira" com as definições mais básicas sobre o assunto.

Expressões Regulares: o que são e para que servem?

Muitas vezes precisamos buscar por determinadas palavras, nomes ou até mesmo trechos de código em um arquivo e, a partir dessa procura, realizar algumas alterações. As expressões regulares surgem como uma maneira de especificar um padrão existente entre essas palavras, para que não seja necessário procurar cada uma separadamente.

Se usássemos métodos comuns de pesquisa, com texto normal, seria impossível ordenar um software para buscar, por exemplo, todas as palavras de um documento que comecem com "A" e terminem com "o". Portanto, as expressões regulares fazem uso de caracteres especiais – como *, ^, + e –, cada um contendo uma função. Ao fim, acaba-se obtendo uma espécie de "fórmula lógica" capaz de realizar as buscas mais mirabolantes que um administrador ou usuário venha a precisar.

São muitos os softwares que reconhecem e interpretam as expressões regulares: clientes de email, editores de texto, a linha de comando do Linux, linguagens de programação, etc. Portanto, diversas classes de usuários acabam se beneficiando ao saber trabalhar com essas expressões: desde o estudante que procura por certo erro de digitação em um documento até o administrador que necessita filtrar as informações mais relevantes de um arquivo de log.

Metacaracteres para toda ocasião

Para trabalhar com as expressões regulares, usaremos os metacaracteres, ou seja, caracteres que representam um conjunto de outros caracteres ou que estipulem certas regras para a busca. E para que tudo fique mais poderoso, saiba que é possível combinar texto comum com metacaracteres. Portanto, vamos ver o que faz cada um deles e, em seguida, como usá-los na prática.

Para começar, podemos estipular que nossa busca deve ser realizada no início de uma linha. Para isso, usamos o caractere ^. Caso a busca deva casar com uma expressão no fim da linha, usamos o cifrão ($).

Além desses, existem os caracteres que trabalham com o texto em si. Podemos, por exemplo, estabelecer uma lista de letras a serem buscadas, colocando-as entre colchetes: [asd], por exemplo, busca pelas letras "a" ou "s" ou "d". Um intervalo pode ser definido com a ajuda do hífen: [f-h] busca pelas letras "f", "g" ou "h".

Lembra-se do acento circunflexo? Dentro dos colchetes ele muda de função e passa a representar negação: [^vxz] busca por qualquer caractere, com exceção de "v", "x" ou "z". E se a procura for por palavras, podemos colocá-las entre parênteses e separadas pela barra vertical, também chamada de pipe (cano, em inglês): (papa|pop), por exemplo, busca pelas palavras "papa" ou "pop".

Há também metacaracteres usados para especificar uma repetição. Digamos, por exemplo, que você deseje procurar por um erro de digitação muito comum: duas letras "a" seguidas. Para isso, usaríamos o número entre colchetes, logo depois da letra: a{2}. Se a repetição fosse de duas a cinco vezes, a expressão ficaria a{2,5}. Para estipular que a repetição da letra "a" deve ocorrer pelo menos duas vezes, use a{ 2,}. Não se esqueça de trocar a letra e o número de acordo com as suas necessidades.

Ainda sobre a quantidade com que uma letra ou expressão pode ocorrer durante a busca, existem os metacaracteres ?, * e +, que simbolizam, respectivamente, zero ou uma vez, zero ou mais vezes, uma ou mais vezes. Exemplos: a?, a* ou a+.

Para finalizar, saiba que existem caracteres curingas. O ponto final, por exemplo, casa com um caractere qualquer, enquanto o asterisco casa com qualquer coisa. A partir disso, é possível combinar esses operadores de diversas formas e com a extensão que você precisar. Não há limites de número de caracteres para a criatividade ou necessidade.

Testando expressões regulares com o egrep

Vamos fazer um teste. Para começar, lembre-se do tutorial de introdução ao editor de textos Vim e crie um arquivo de texto com as seguintes palavras, uma a cada linha:

  • Linux
  • Canaltech
  • Linus Torvalds
  • Computador
  • HTML
  • CSS

Salve o arquivo como "teste.txt" e execute o seguinte comando:

egrep Canaltech teste.txt

Você perceberá que o resultado será o conteúdo da única linha do arquivo que possui a palavra "Canaltech". Note também que o comando egrep faz distinção entre maiúsculas e minúsculas e, portanto, "canaltech" é diferente de "Canaltech".

Agora, vamos complicar um pouco e procurar por todas as linhas que começam com a letra L:

egrep '^L' teste.txt

O resultado deve ser as linhas "Linux" e "Linus Torvalds". E não se esqueça de colocar a expressão regular entre aspas simples, caso contrário, os caracteres especiais serão interpretados de maneira diferente pelo terminal.

Quer mais um teste? Experimente retirar o sinal de circunflexo do comando anterior: agora o resultado também acrescenta a palavra "HTML", já que a busca não está mais posicionada no início das linhas. Caso quiséssemos buscar apenas as linhas que terminam em "L", usaríamos a expressão 'L$'. Teste e confira o resultado.

Que tal procurarmos por todas as linhas que possuem repetição da letra "S"? Muito simples, basta executar egrep 'S{2}' teste.txt. O resultado será a última linha do arquivo, que contém a palavra "CSS".

Caso queira procurar por todas as palavras que contenham pelo menos uma letra "a", basta usar egrep 'a+' teste.txt.

Para buscar uma linha em branco, por exemplo, usa-se os metacaracteres de início e fim de linha juntos: '^$'. No caso de você precisar buscar pelo cifrão, é preciso indicar ao egrep que ele não deve ser interpretado como metacaractere, e sim usado literalmente. Para isso, usa-se a contra-barra antes do cifrão: egrep '\$' arquivo.txt.

Com base nesses pequenos exercícios, você consegue deduzir expressões mais complexas que, com o tempo, se tornarão muito úteis. Se você deseja casar qualquer endereço de email dentro de um arquivo, a expressão regular já fica bem maior: egrep "\b[a-zA-Z0-9.-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9.-]+\b" arquivo.txt.

Apesar de mais complicada, essa linha pode dar um exemplo melhor de como as expressões se tornam complexas e poderosas à medida que são mais elaboradas. Portanto, vale a pena se debruçar sobre guias de estudo e aprender a usá-las. Afinal, você precisará das expressões regulares tão cedo ou tarde.

Este artigo faz parte de nossa biblioteca de conteúdo "Tudo o que você precisa saber sobre o Linux". Não deixe de acessar e conferir todo o conteúdo publicado sobre o Pinguim.

Fonte: http://www.shellhacks.com/en/RegEx-Find-Email-Addresses-in-a-File-using-Grep

Fique por dentro do mundo da tecnologia!

Inscreva-se em nossa newsletter e receba diariamente as notícias por e-mail.