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.