Editor de fluxo - caracteres especiais

SED fornece dois caracteres especiais que são tratados como comandos. Este capítulo ilustra o uso desses dois caracteres especiais.

= Comando

O comando "=" lida com números de linha. A seguir está a sintaxe do comando "=":

[/pattern/]= 
[address1[,address2]]=

O comando = grava o número da linha seguido por seu conteúdo no fluxo de saída padrão. O exemplo a seguir ilustra isso.

[jerry]$ sed '=' books.txt

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

1 
1) A Storm of Swords, George R. R. Martin, 1216 
2 
2) The Two Towers, J. R. R. Tolkien, 352 
3 
3) The Alchemist, Paulo Coelho, 197 
4 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5 
5) The Pilgrimage, Paulo Coelho, 288 
6 
6) A Game of Thrones, George R. R. Martin, 864

Vamos imprimir os números das linhas e o conteúdo das primeiras quatro linhas. O comando a seguir imprime as primeiras quatro linhas com números de linha e o restante sem números de linha.

[jerry]$ sed '1, 4=' books.txt

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

1 
1) A Storm of Swords, George R. R. Martin, 1216 
2 
2) The Two Towers, J. R. R. Tolkien, 352 
3 
3) The Alchemist, Paulo Coelho, 197 
4 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

Além disso, podemos instruir o SED a imprimir números de linha quando uma correspondência de padrão for bem-sucedida. O exemplo a seguir imprime o número da linha que contém o padrão "Paulo".

[jerry]$ sed '/Paulo/ =' books.txt

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3 
3) The Alchemist, Paulo Coelho, 197 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

Você consegue adivinhar o que o seguinte comando SED faz?

[jerry]$ sed -n '$ =' books.txt

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

6

Sim você está certo. Conta o número total de linhas presentes no arquivo. Vamos desmistificar o código. Na seção de comando, usamos "$ =" que imprime o número da linha da última linha seguido por seu conteúdo. Mas também fornecemos o-n sinalizador que suprime a impressão padrão do buffer de padrão. Portanto, apenas o número da última linha é exibido.

& Comando

SED suporta o caractere especial &. Sempre que uma correspondência de padrão é bem-sucedida, esse caractere especial armazena o padrão correspondido. Geralmente é usado com o comando de substituição. Vamos ver como podemos aproveitar esse recurso eficiente.

Cada linha no arquivo book.txt é numerada. Vamos adicionar as palavrasBook numberno início de cada linha. O exemplo a seguir ilustra isso.

[jerry]$ sed 's/[[:digit:]]/Book number &/' books.txt

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

Book number 1) A Storm of Swords, George R. R. Martin, 1216 
Book number 2) The Two Towers, J. R. R. Tolkien, 352 
Book number 3) The Alchemist, Paulo Coelho, 197 
Book number 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
Book number 5) The Pilgrimage, Paulo Coelho, 288 
Book number 6) A Game of Thrones, George R. R. Martin, 864

Este exemplo é muito simples. Primeiro, procuramos a primeira ocorrência de um dígito, que é o número da linha (é por isso que usamos [[: dígito:]]) e o SED armazena automaticamente o padrão combinado no caractere especial &. Na segunda etapa, inserimos as palavrasBook number antes de cada padrão correspondido, ou seja, antes de cada linha.

Vejamos outro exemplo. No arquivo book.txt, o último dígito indica o número de páginas do livro. Vamos adicionar "Pages =" antes disso. Para fazer isso, encontre a última ocorrência do dígito e substitua-a por "Páginas = &". Aqui, & armazena o padrão combinado, ou seja, o número de páginas

[jerry]$ sed 's/[[:digit:]]*$/Pages = &/' books.txt

Ao executar a sintaxe acima, você obtém o seguinte resultado:

1) A Storm of Swords, George R. R. Martin, Pages = 1216 
2) The Two Towers, J. R. R. Tolkien, Pages = 352 
3) The Alchemist, Paulo Coelho, Pages = 197 
4) The Fellowship of the Ring, J. R. R. Tolkien, Pages = 432 
5) The Pilgrimage, Paulo Coelho,Pages = 288 
6) A Game of Thrones, George R. R. Martin, Pages = 864

Por enquanto, basta lembrar que [[:digit:]]*$encontra a última ocorrência do dígito. No capítulo "Expressões regulares, exploraremos mais sobre expressões regulares.