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