Editor de fluxo - Expressões regulares

São as expressões regulares que tornam o SED poderoso e eficiente. Várias tarefas complexas podem ser resolvidas com expressões regulares. Qualquer especialista em linha de comando conhece o poder das expressões regulares.

Como muitos outros utilitários GNU / Linux, SED também suporta expressões regulares, que são freqüentemente chamadas de regex. Este capítulo descreve as expressões regulares em detalhes. O capítulo é dividido em três seções: Expressões regulares padrão, classes POSIX de expressões regulares e caracteres Meta.

Expressões regulares padrão

Início da linha (^)

Na terminologia das expressões regulares, o símbolo circunflexo (^) corresponde ao início de uma linha. O exemplo a seguir imprime todas as linhas que começam com o padrão "The".

[jerry]$ sed -n '/^The/ p' books.txt

Ao executar o código acima, você obtém o seguinte resultado:

The Two Towers, J. R. R. Tolkien 
The Alchemist, Paulo Coelho 
The Fellowship of the Ring, J. R. R. Tolkien 
The Pilgrimage, Paulo Coelho

Fim da linha ($)

O fim da linha é representado pelo símbolo do dólar ($). O exemplo a seguir imprime as linhas que terminam com "Coelho".

[jerry]$ sed -n '/Coelho$/ p' books.txt

Ao executar o código acima, você obtém o seguinte resultado:

The Alchemist, Paulo Coelho 
The Pilgrimage, Paulo Coelho

Caractere único (.)

O ponto (.) Corresponde a qualquer caractere único, exceto o caractere de fim de linha. O exemplo a seguir imprime todas as palavras de três letras que terminam com o caractere "t".

[jerry]$ echo -e "cat\nbat\nrat\nmat\nbatting\nrats\nmats" | sed -n '/^..t$/p'

Ao executar o código acima, você obtém o seguinte resultado:

cat 
bat 
rat 
mat

Match Character Set ([])

Na terminologia de expressão regular, um conjunto de caracteres é representado por colchetes ([]). É usado para combinar apenas um de vários caracteres. O exemplo a seguir corresponde aos padrões "Call" e "Tall", mas não "Ball".

[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[CT]all/ p'

Ao executar o código acima, você obtém o seguinte resultado:

Call 
Tall

Conjunto exclusivo ([^])

No conjunto exclusivo, o circunflexo nega o conjunto de caracteres entre colchetes. O exemplo a seguir imprime apenas "Bola".

[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[^CT]all/ p'

Ao executar o código acima, você obtém o seguinte resultado:

Ball

Faixa de caracteres ([-])

Quando um intervalo de caracteres é fornecido, a expressão regular corresponde a qualquer caractere dentro do intervalo especificado entre colchetes. O exemplo a seguir corresponde a "Call" e "Tall", mas não a "Ball".

[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[C-Z]all/ p'

Ao executar o código acima, você obtém o seguinte resultado:

Call 
Tall

Agora vamos modificar o intervalo para "AP" e observar o resultado.

[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[A-P]all/ p'

Ao executar o código acima, você obtém o seguinte resultado:

Call 
Ball

Zero em uma ocorrência (\?)

No SED, o ponto de interrogação (\?) Corresponde a zero ou a uma ocorrência do caractere anterior. O exemplo a seguir corresponde a "Comportamento" e também a "Comportamento". Aqui, criamos "u" como um caractere opcional usando "\?".

[jerry]$ echo -e "Behaviour\nBehavior" | sed -n '/Behaviou\?r/ p'

Ao executar o código acima, você obtém o seguinte resultado:

Behaviour 
Behavior

Uma ou mais ocorrências (\ +)

No SED, o símbolo de mais (\ +) corresponde a uma ou mais ocorrências do caractere anterior. O exemplo a seguir corresponde a uma ou mais ocorrências de "2".

[jerry]$ echo -e "111\n22\n123\n234\n456\n222"  | sed -n '/2\+/ p'

Ao executar o código acima, você obtém o seguinte resultado:

22 
123 
234 
222

Zero ou mais ocorrências (*)

Asteriscos (*) correspondem a zero ou mais ocorrências do caractere anterior. O exemplo a seguir corresponde a "ca", "cat", "catt" e assim por diante.

[jerry]$ echo -e "ca\ncat" | sed -n '/cat*/ p'

Ao executar o código acima, você obtém o seguinte resultado:

ca 
cat

Exatamente N ocorrências {n}

{n} corresponde exatamente a "n" ocorrências do caractere anterior. O exemplo a seguir imprime apenas números de três dígitos. Mas antes disso, você precisa criar o seguinte arquivo que contém apenas números.

[jerry]$ cat numbers.txt

Ao executar o código acima, você obtém o seguinte resultado:

1 
10 
100 
1000 
10000 
100000 
1000000 
10000000 
100000000 
1000000000

Vamos escrever a expressão SED.

[jerry]$ sed -n '/^[0-9]\{3\}$/ p' numbers.txt

Ao executar o código acima, você obtém o seguinte resultado:

100

Observe que o par de chaves é escapado pelo caractere "\".

Pelo menos n ocorrências {n,}

{n,} corresponde a pelo menos "n" ocorrências do caractere anterior. O exemplo a seguir imprime todos os números maiores ou iguais a cinco dígitos.

[jerry]$ sed -n '/^[0-9]\{5,\}$/ p' numbers.txt

Ao executar o código acima, você obtém o seguinte resultado:

10000 
100000 
1000000
10000000 
100000000 
1000000000

Ocorrência de M a N {m, n}

{m, n} corresponde a pelo menos "m" e no máximo "n" ocorrências do caractere anterior. O exemplo a seguir imprime todos os números com pelo menos cinco dígitos, mas não mais do que oito dígitos.

[jerry]$ sed -n '/^[0-9]\{5,8\}$/ p' numbers.txt

Ao executar o código acima, você obtém o seguinte resultado:

10000 
100000 
1000000 
10000000

Tubo (|)

No SED, a barra vertical se comporta como uma operação OR lógica. Corresponde aos itens de ambos os lados do tubo. O exemplo a seguir corresponde a "str1" ou "str3".

[jerry]$ echo -e "str1\nstr2\nstr3\nstr4" | sed -n '/str\(1\|3\)/ p'

Ao executar o código acima, você obtém o seguinte resultado:

str1 
str3

Observe que o par de parênteses e barra vertical (|) é escapado pelo caractere "\".

Personagens em fuga

Existem certos caracteres especiais. Por exemplo, nova linha é representada por "\ n", retorno de carro é representado por "\ r" e assim por diante. Para usar esses caracteres no contexto ASCII normal, temos que fazer o escape deles usando o caractere de barra invertida (\). Este capítulo ilustra o escape de caracteres especiais.

Escapando "\"

O exemplo a seguir corresponde ao padrão "\".

[jerry]$ echo 'str1\str2' | sed -n '/\\/ p'

Ao executar o código acima, você obtém o seguinte resultado:

str1\str2

Escapando "\ n"

O exemplo a seguir corresponde ao caractere de nova linha.

[jerry]$ echo 'str1\nstr2' | sed -n '/\\n/ p'

Ao executar o código acima, você obtém o seguinte resultado:

str1\nstr2

Escapando "\ r"

O exemplo a seguir corresponde ao retorno de carro.

[jerry]$ echo 'str1\rstr2' | sed -n '/\\r/ p'

Ao executar o código acima, você obtém o seguinte resultado:

str1\rstr2

Escapando de "\ dnnn"

Corresponde a um caractere cujo valor ASCII decimal é "nnn". O exemplo a seguir corresponde apenas ao caractere "a".

[jerry]$ echo -e "a\nb\nc" | sed -n '/\d97/ p'

Ao executar o código acima, você obtém o seguinte resultado:

a

Escapando "\ onnn"

Corresponde a um caractere cujo valor ASCII octal é "nnn". O exemplo a seguir corresponde apenas ao caractere "b".

[jerry]$ echo -e "a\nb\nc" | sed -n '/\o142/ p'

Ao executar o código acima, você obtém o seguinte resultado:

b

Corresponde a um caractere cujo valor hexadecimal ASCII é "nnn". O exemplo a seguir corresponde apenas ao caractere "c".

[jerry]$ echo -e "a\nb\nc" | sed -n '/\x63/ p'

Ao executar o código acima, você obtém o seguinte resultado:

c

Classes POSIX de expressões regulares

Existem certas palavras reservadas que têm um significado especial. Essas palavras reservadas são chamadas de classes POSIX de expressão regular. Esta seção descreve as classes POSIX suportadas pelo SED.

[: alnum:]

Implica caracteres alfabéticos e numéricos. O exemplo a seguir corresponde apenas a "Um" e "123", mas não corresponde ao caractere de tabulação.

[jerry]$ echo -e "One\n123\n\t" | sed -n '/[[:alnum:]]/ p'

Ao executar o código acima, você obtém o seguinte resultado:

One 
123

[:alfa:]

Implica apenas caracteres alfabéticos. O exemplo a seguir corresponde apenas à palavra "Um".

[jerry]$ echo -e "One\n123\n\t" | sed -n '/[[:alpha:]]/ p'

Ao executar o código acima, você obtém o seguinte resultado:

One

[:em branco:]

Isso implica um caractere em branco que pode ser um espaço ou tabulação. O exemplo a seguir corresponde apenas ao caractere de tabulação.

[jerry]$ echo -e "One\n123\n\t" | sed -n '/[[:space:]]/ p' | cat -vte

Ao executar o código acima, você obtém o seguinte resultado:

^I$

Observe que o comando "cat -vte" é usado para mostrar caracteres de tabulação (^ I).

[: dígito:]

Implica apenas números decimais. O exemplo a seguir corresponde apenas ao dígito "123".

[jerry]$ echo -e "abc\n123\n\t" | sed -n '/[[:digit:]]/ p'

Ao executar o código acima, você obtém o seguinte resultado:

123

[:mais baixo:]

Isso implica apenas em letras minúsculas. O exemplo a seguir corresponde a apenas "um".

[jerry]$ echo -e "one\nTWO\n\t" | sed -n '/[[:lower:]]/ p'

Ao executar o código acima, você obtém o seguinte resultado:

one

[:superior:]

Implica apenas letras maiúsculas. O exemplo a seguir corresponde apenas a "DOIS".

[jerry]$ echo -e "one\nTWO\n\t" | sed -n '/[[:upper:]]/ p'

Ao executar o código acima, você obtém o seguinte resultado:

TWO

[: ponto:]

Implica sinais de pontuação que incluem caracteres alfanuméricos ou sem espaço

[jerry]$ echo -e "One,Two\nThree\nFour" | sed -n '/[[:punct:]]/ p'

Ao executar o código acima, você obtém o seguinte resultado:

One,Two

[:espaço:]

Isso implica caracteres de espaço em branco. O exemplo a seguir ilustra isso.

[jerry]$ echo -e "One\n123\f\t" | sed -n '/[[:space:]]/ p' | cat -vte

Ao executar o código acima, você obtém o seguinte resultado:

123^L^I$

Metacaracteres

Como as expressões regulares tradicionais, o SED também oferece suporte a metacaracteres. Estas são expressões regulares do estilo Perl. Observe que o suporte a metacaracteres é específico do GNU SED e pode não funcionar com outras variantes do SED. Vamos discutir metacaracteres em detalhes.

Limite de palavras (\ b)

Na terminologia de expressão regular, "\ b" corresponde ao limite da palavra. Por exemplo, "\ bthe \ b" corresponde a "the", mas não a "these", "there", "they", "then" e assim por diante. O exemplo a seguir ilustra isso.

[jerry]$ echo -e "these\nthe\nthey\nthen" | sed -n '/\bthe\b/ p'

Ao executar o código acima, você obtém o seguinte resultado:

the

Limite de não palavra (\ B)

Na terminologia de expressão regular, "\ B" corresponde ao limite de não palavra. Por exemplo, "o \ B" corresponde a "estes" e "eles", mas não a "o". O exemplo a seguir ilustra isso.

[jerry]$ echo -e "these\nthe\nthey" | sed -n '/the\B/ p'

Ao executar o código acima, você obtém o seguinte resultado:

these 
they

Espaço em branco único (\ s)

Em SED, "\ s" implica um único caractere de espaço em branco. O exemplo a seguir corresponde a "Linha \ t1", mas não corresponde a "Linha1".

[jerry]$ echo -e "Line\t1\nLine2" | sed -n '/Line\s/ p'

Ao executar o código acima, você obtém o seguinte resultado:

Line 1

Espaço não em branco único (\ S)

Em SED, "\ S" implica um único caractere de espaço em branco. O exemplo a seguir corresponde a "Linha2", mas não corresponde a "Linha \ t1".

[jerry]$ echo -e "Line\t1\nLine2" | sed -n '/Line\S/ p'

Ao executar o código acima, você obtém o seguinte resultado:

Line2

Caractere de palavra única (\ w)

Em SED, "\ w" implica um caractere de palavra única, ou seja, caracteres alfabéticos, dígitos e sublinhado (_). O exemplo a seguir ilustra isso.

[jerry]$ echo -e "One\n123\n1_2\n&;#" | sed -n '/\w/ p'

Ao executar o código acima, você obtém o seguinte resultado:

One 
123 
1_2

Caractere Não Word Único (\ W)

Em SED, "\ W" implica um único caractere não palavra que é exatamente oposto a "\ w". O exemplo a seguir ilustra isso.

[jerry]$ echo -e "One\n123\n1_2\n&;#" | sed -n '/\W/ p'

Ao executar o código acima, você obtém o seguinte resultado:

&;#

Início do Espaço Padrão (\ `)

Em SED, "\` "implica o início do espaço do padrão. O exemplo a seguir corresponde apenas à palavra "Um".

[jerry]$ echo -e "One\nTwo One" | sed -n '/\`One/ p'

Ao executar o código acima, você obtém o seguinte resultado:

One