|
From: | Janduy Euclides |
Subject: | Re: [shell-script] Dúvida sobre Pattern Space do Sed |
Date: | Mon, 17 Oct 2016 19:57:13 -0200 |
O livro do Júlio é fantástico, não sou nenhum craque em Shell como a maioria dos integrantes do grupo. Mas o livro é muito bom!
Parabéns Júlio!
Um pedaço do meu livro:Comandos que interagem com os buffers
Existem oito comandos - cuja funções estão sintetizadas na tabela a seguir - para o sed interagir com esses dois buffers:
Comandos
Função
n N
Lê/adiciona a próxima linha ao Pattern Space.
h H
Copia/adiciona Pattern Space ao Hold Space.
g G
Copia/adiciona Hold Space ao Pattern Space.
p P
Imprime todas/1ª linha do Pattern Space
d...D
Deleta todas/1ª linha do Pattern Space
x
Intercambia o conteúdo dos dois buffers.
Na tabela que acabamos de ver, "copia" significa colocar um conteúdo no buffer, destruindo o que já havia e "adiciona", significa somar o dado ao que já existia no buffer, separando o conteúdo antigo do recente por um <ENTER> (\n).
Ainda sobre essa tabela, os comandos p e d, são os mesmos que já vimos, que servem para listar e deletar, respectivamente, o conteúdo do Pattern Space.
Como tive muita dificuldade para entender isso, vou explicar bem devagar:
O comando n imprime todo o conteúdo do Pattern Space (a não ser que a opção -n do sed esteja ativa), esvazia totalmente o Pattern Space e lê o próximo registro.
O comando N não lista nem esvazia o Pattern Space, ele manda ler mais uma linha e a coloca por baixo do que já existia no Pattern Space, separando-a do que lá estava por um caractere de line feed (<ENTER>).
O comando p, é nosso velho conhecido e ele lista todo o conteúdo do Pattern Space., já o comando P, lista somente até o primeiro line feed (<ENTER>), isto é, lista somente a primeira linha do Pattern Space. Nenhum dos dois altera o conteúdo do Pattern Space.
Vamos ver exemplos:
$ seq 6 | sed -n 'N;P' # P MAIÚSCULO
1
3
5
$ seq 6 | sed -n 'N;p' # p minúsculo
1
2
3
4
5
6
No primeiro exemplo listei somente os ímpares, porque enquanto o N enfiava a linha par por baixo da ímpar no buffer, o P imprimia somente a primeira. No segundo o p imprimia todo o conteúdo, então listou toda a entrada.
$ seq 6 | sed -n 'n;P' # P MAIÚSCULO
2
4
6
$ seq 6 | sed -n 'n;p' # p minúsculo
2
4
6
Nesse caso a saída dos 2 exemplos é idêntica, porque o comando n é destrutivo. ele apagou o buffer (que no início tinha o número 1) e jogou outro por cima (no caso o 2). Como tinha uma única linha no Pattern Space, tanto faz usar o p ou o P.
O comando d apaga o conteúdo do Pattern Space, lê a próxima linha e sai do comando, voltando para o sed.
O comando D remove somente a primeira linha do Pattern Space, e volta para o primeiro comando do sed.
Para eliminar a linha que tem a cadeia 3:
$ seq 6 | sed '/3/{d;n}'
1
2
4
5
6
Ou seja, quando encontrou a cadeia 3, o comando d mandou esvaziar o Pattern Space mandando seu conteúdo (o 3) pro brejo e o n leu o próximo registro.
Para deletar 3 linhas a partir da linha 2, podemos fazer:
$ seq 6 | sed '2 { # Posiciona na linha 2
> N # Lê a 3 para o Pattern Space
> N # Lê a 4 para o Pattern Space
> d # Limpa o Pattern Space
> }'
1
5
6
Os comentários laterais já explicaram esse exemplo.
Vamos numerar as linhas de frutas:
$ cat frutas
abacate
maçã
morango
pera
tangerina
uva
$ sed '=' frutas
1
abacate
2
maçã
3
morango
4
pera
5
tangerina
6
uva
Agora vamos botar o número junto à linha, separados por um <TAB>.
$ sed = frutas | sed 'N;s/\n/\t/'
1 abacate
2 maçã
3 morango
4 pera
5 tangerina
6 uva
Ou seja, o N trouxe outra linha para o Space Buffer e o comando s (substitute) trocou o <ENTER> (\n) pelo <TAB> (\t).
Em 17 de outubro de 2016 16:34, address@hidden [shell-script] <address@hidden.br > escreveu:Olá, senhores.
Estou com uma dúvida relacionada ao comando 'N' do SED, alguém poderia me explicar o funcionamento do mesmo juntamente com um exemplo prático.Eu sei que pode ser uma pergunta besta, mas estudei e estudei e não conseguir entender.Desde já agradeço pela ajuda.
[Prev in Thread] Current Thread [Next in Thread]
- Dúvida sobre Pattern Space do Sed, andrelucio . fc, 2016/10/17
- Re: [shell-script] Dúvida sobre Pattern Space do Sed, Julio C. Neves, 2016/10/17
- Message not available
- Message not available
- Re: [shell-script] Dúvida sobre Pattern Space do Sed, Janduy Euclides <=
- Re: Dúvida sobre Pattern Space do Sed, andrelucio . fc, 2016/10/20
- Prev by Date: Re: [shell-script] Dúvida sobre Pattern Space do Sed
- Next by Date: Re: [shell-script] ShellScript Contador
- Previous by thread: Re: [shell-script] Dúvida sobre Pattern Space do Sed
- Next by thread: Re: Dúvida sobre Pattern Space do Sed
- Index(es):