Escolar Documentos
Profissional Documentos
Cultura Documentos
|
endereo
| http://aurelio.net/sed/sed-HOWTO/
| http://aurelio.net/sed/sed-HOWTO.html
| http://aurelio.net/sed/sed-HOWTO.txt
| detalhe
| vrias pginas
| tudo-em-um
| verso texto
2000-09-13 v0.2
- Criada seo Anncio
- Criada seo Registro de mudanas
- Criada seo Agradecimentos
- Disponibilizado este documento em HTML compactado
- Retirada entrada duplicada na seo Emulando outros comandos
2000-08-2 v0.1
- 1 verso
- Disponibilizao na internet
1.5. Agradecimentos
===================
Meus agradecimentos sinceros queles que comentaram, enviaram sugestes e
correes, ou ajudaram na divulgao, via e-mail ou internet.
-
.*@conectiva
.*@lista_sed-br
.*@lista_sed-users
Carlos Alvsan
Eduardo Mendes
Rafael Steil
Rodrigo Bernardo Pimentel
Rubens Queiroz de Almeida & Dicas-l
Srgio Bruder & .BR
Thobias Salazar Trevisan
Tiago Barros & senha.org
2. Conhecendo o sed
===================
Algumas estruturas complexas podem ser simuladas com alguma tcnica, mas se
o seu programa em Sed comeou a inchar muito, aconselhvel reescrev-lo
numa linguagem com mais recursos, como o perl.
3. Perdendo o medo do sed
=========================
3.1. Como ele funciona
======================
O Sed funciona como um filtro, por onde voc passa um texto X e ele joga
na sada um texto Y.
O texto X virou Y seguindo algumas regrinhas que voc determinou.
Pense no Sed como um processador de alimentos, dependendo da lmina
utilizada, a batata sai cortada de uma maneira diferente :)
- o Sed funciona como um filtro, ou conversor.
- o Sed orientado a linha, de cima para baixo, da esquerda para a direita.
- o Sed l uma linha da entrada padro (STDIN) ou de um arquivo especificado,
aplica os comandos de edio e mostra o resultado na sada padro (STDOUT).
vai para a prxima linha e repete o processo.
- o Sed aceita endereos para os comandos.
- o Sed aplica os comandos para todas as linhas caso um endereo no
seja especificado.
- o Sed faz uso intensivo de expresses regulares.
- o Sed macho :)
3.2. Sua sintaxe
================
A sintaxe genrica de um comando Sed :
sed [opes] regras [arquivo]
Sendo que regras tem a forma genrica de:
[endereo1 [, endereo2]] comando [argumento]
3.2.1. Exemplo
==============
Como notao tradicional, o que est [entre colchetes] opcional, ento a
sintaxe Sed mais simples que existe sed regra como em:
prompt$ cat texto.txt | sed p
Ou seja, o Sed lendo da entrada padro o contedo do arquivo texto.txt
!
;
,
{
}
s
y
i
c
a
g
G
h
H
x
restaura
restaura
guarda o
guarda o
troca os
p
P
l
imprime o [PADRO]
imprime a primeira linha do [PADRO]
imprime o [PADRO] mostrando caracteres brancos
r
w
:
b
t
d
D
n
N
q
apaga o [PADRO]
apaga a primeira linha do [PADRO]
vai para a prxima linha
anexa a prxima linha no [PADRO]
finaliza o Sed imediatamente
=
:
#
s i c a y
g G h H x
p P l
r w
g i !
; -e \n
b t d D n N q
// ,
{} \(\)
\1 \2 ... \9
5. Conceitos bsicos
====================
Aqui vo conhecimentos que voc precisa assimilar para fazer um bom uso do
Sed.
5.1. Suprimindo a sada padro
==============================
5.1.1. Sada normal
===================
Normalmente o Sed sempre imprime na sada padro todas as linhas do
arquivo, modificadas ou no.
Veja o primeiro exemplo citado:
prompt$ sed 'p' texto.txt
O comando p imprime a linha na sada padro. Este exemplo duplica todas
as linhas do arquivo pois, alm da impresso normal de cada linha, ainda
aplicado o comando p em cada uma, que diz "imprima esta linha", fazendo
com que ela aparea duas vezes.
5.1.2. Sada suprimida
======================
Temos como modificar este comportamento com a opo -n, que significa
"no imprima na sada, a no ser quando especificado com o comando p ou o
l".
Assim sendo, colocando o -n, eliminamos o comportamento padro de
"imprimir sempre na sada":
prompt$ sed -n 'p' texto.txt
Que resulta no contedo do arquivo, pois cada linha impressa apenas uma
vez, devido ao comando p. Assim fica fcil entender como funciona o
exemplo j citado que imprime apenas a linha 5 de um arquivo:
prompt$ sed -n 5p texto.txt
Ok, a explicao daquele 5 ali perdido vem logo a seguir no tpico
O endereo :)
5.2. O endereo
===============
O endereo serve para voc dizer ao Sed para aplicar um determinado
comando apenas nas linhas informadas. Este endereo pode ser descrito
direto como o nmero da linha, ou por parte de seu contedo (entre
/barras/).
Caso o endereo no seja informado, o comando Sed ser aplicado para
todas as linhas.
5.2.1. Endereo simples
=======================
Por exemplo, referenciando a linha pelo seu nmero, como j foi visto
anteriormente:
prompt$ sed '5d' texto.txt
Mas tambm poderia ser uma linha que tivesse uma palavra qualquer:
prompt$ sed '/estorvo/d' texto.txt
O comando d apaga linhas segundo o endereo, ento este comando
apagar todas as linhas que tiverem a palavra estorvo. Este exemplo tem o
funcionamento idntico ao comando:
prompt$ grep -v estorvo texto.txt
5.2.2. Intervalo
================
Como endereo, ainda se pode especificar um intervalo, como da linha
5 at a linha 10, ou da linha 5 at a linha que tiver a palavra estorvo:
prompt$ sed '5,10d' texto.txt
prompt$ sed '5,/estorvo/d' texto.txt
No endereo, temos um caractere especial, o $ que referencia
ltima linha do texto. Assim sendo, para apagar da linha 10 at o
final do texto, o comando :
prompt$ sed '10,$d' texto.txt
5.2.3. Outros
=============
No Sed da GNU, a partir da verso 3.02a(*), foi adicionada uma maneira
nova de especificar um endereo:
prompt$ sed '/estorvo/,+3d' texto.txt
Que referencia a linha que contm a palavra estorvo e mais as 3 linhas
seguintes.
E pra finalizar, como j dito anteriormente, quando o comando no tem
endereo, aplicado para todas as linhas:
prompt$ sed 'd' texto.txt
(*) veja o tpico Nota sobre os adicionais GNU
5.3. Interrompendo o processamento
==================================
A qualquer hora voc pode abortar o comando Sed com o comando q.
Isso til no nosso exemplo anterior de emular o comando head,
imprimindo apenas as 10 primeiras linhas do arquivo:
sed '10q'
Para evitar ter que ficar se escapando todas estas barras, basta lembrar
que o comando s aceita qualquer delimitador, sendo a barra apenas um
padro de referncias histricas. Ento, neste caso, poderamos escolher
outro delimitador como por exemplo a vrgula:
prompt$ sed 's,/usr/local/bin,/usr/bin,' texto.txt
Evitando-se de ter que ficar escapando as barras. A mesma dica vale para o
comando y.
6.2.2. No endereo
==================
E se precisssemos apagar as linhas que contm o /usr/local/bin? Teramos
que colocar o nome do diretrio no endereo do comando d, voltando
com a festa dos escapes:
prompt$ sed '/\/usr\/local\/bin/d' texto.txt
Para usarmos outro delimitador no endereo, basta escaparmos o
primeiro, que no caso abaixo a vrgula:
prompt$ sed '\,/usr/local/bin,d' texto.txt
Confuso de delimitadores com o texto a ser procurado muito comum de
acontecer, ento se algo no est funcionando como deveria, olhe com
cuidado para ver se no h conflitos entre eles.
6.3. Escapes para caracteres especiais
======================================
No Sed da GNU, a partir da verso 3.02.80(*), vrios escapes novos
foram adicionados e podem ser usados nas duas partes do comando s///:
\a
\f
\n
\r
\t
\v
\oNNN
\dNNN
\xNN
beep
(apito)
form-feed
(avana linha)
newline
(quebra de linha)
carriage-return (retorno de carro)
hTAB
(tabulao horizontal)
vTAB
(tabulao vertical)
o caractere de valor octal NNN
o caractere de valor decimal NNN
o caractere de valor hexadecimal NN
7. Tarefas diversas
===================
7.1. Como substituir alguma coisa por uma quebra de linha
=========================================================
=====================
Uma tarefa comum incluir cabealho e rodap num arquivo qualquer. O
Sed possui um comando especfico para ler arquivos, o r, ento
basta(*):
prompt$ sed -e '1r cabecalho.txt' -e '$r rodape.txt' texto.txt
Para incluir o cabealho aps a linha 1 e incluir o rodap aps a
ltima linha.
(*) a explicao do porqu das opes -e est no tpico
Aplicando vrios comandos de uma vez.
7.4.2. Gravando arquivos
========================
O comando w grava num arquivo a linha atual, ou melhor, o contedo do
espao padro. Por exemplo, voc quer gravar num arquivo o resultado de
uma busca por linhas que contm a palavra estorvo. A soluo no-Sed
seria:
prompt$ grep 'estorvo' texto.txt > estorvos.txt
Nosso similar em Sed seria:
prompt$ sed '/estorvo/w estorvos.txt' texto.txt
Gravar dados num arquivo tambm pode servir de espao auxiliar caso o
espao reserva no seja suficiente. Mas esta uma opo drstica, no
to flexvel. Mais informaes sobre o espao reserva no tpico
Conhecendo os registradores internos.
7.5. Trocando um trecho de texto por outro
==========================================
Uma tarefa que parece simples mas confunde, trocar um trecho de texto,
como um pargrafo inteiro por exemplo, por outro trecho, independente do
nmero de linhas de ambos.
7.5.1. Trocar vrias linhas por uma
===================================
Essa simples, basta usar o comando c, que "Coloca" um texto no lugar da
linha atual. A nica complicao definir o endereo, para aplicar
o comando apenas nas linhas desejadas. Por exemplo, vamos colocar uma frase
no lugar de uma rea de texto pr-formatado num documento HTML. Esta rea
delimitada pelos identificadores <pre> e </pre>:
prompt$ sed '/<pre>/,/<\/pre>/c \
prompt$ aqui tinha texto pr-formatado' texto.html
Note que o comando c (assim como o a e o i) exige que o texto que
ele recebe como parmetro esteja na linha seguinte, estando a quebra de
linha escapada com a barra invertida \
No Sed da GNU, a partir da verso 3.02a(*), permitido que se coloque
sed '/<pre>/,/<\/pre>/c \
aqui tinha texto pr-formatado,\
mas eu resolvi tirar.\
porque?\
porque sim' texto.html
=============================
Aqui vo alguns exemplos de emulaes de outros comandos usando-se o
Sed:
|| comando
| cat
| head
| grep
| grep -v
| tac
| tail -1
| tr A-Z a-z
| wc -l
|
|
|
|
|
|
|
|
|
emulao
:
10q
/padro/!d
/padro/d
1!G;h;$!d
$!d
y/ABCDEF...UVWXYZ/abcdef...uvwxyz/
-n $=
sed
sed
sed
sed
sed
sed
sed
sed
10d
# apaga as linhas que contm 'estorvo'
/estorvo/d
Para dizer ao Sed para utilizar aquele arquivo como fonte de comandos,
basta usar a opo -f
prompt$ sed -f programa.sed texto.txt
8.3. Tornando arquivos Sed executveis
======================================
O interpretador de comandos mais utilizado (bash) sempre procura na
primeira linha de um arquivo instrues para execut-lo.
Se um arquivo um programinha em shell, basta colocar
#!/bin/sh
Na primeira linha para que o bash saiba que deve execut-lo com o
comando /bin/sh. O mesmo funciona para qualquer outro interpretador,
como o Sed. ento para tornar um arquivos de comandos Sed
executvel basta colocar como primeira linha:
#!/bin/sed -f
E claro, torn-lo executvel:
prompt$ chmod +x programa.sed
E na linha de comando, chame-o normalmente:
prompt$ ./programa.sed texto.txt
prompt$ cat texto.txt | ./programa.sed
8.4. Conhecendo os registradores internos
=========================================
8.4.1. Apresentao
===================
O Sed possui 2 registradores ("buffers") internos, que so usados para a
manipulao do texto.
Um deles o espao padro ("pattern space"), que o registrador
utilizado normalmente pelo Sed. nele que a linha a ser processada
armazenada e manipulada.
O outro o espao reserva ("hold space"), que um registrador auxiliar,
inicialmente vazio, que serve para guardar uma cpia da linha original,
parte dela, ou agrupar dados diversos de vrias linhas.
H comandos para fazer a troca de dados entre os dois registradores:
h
H
g
G
__________________
|
|
|
|
|__________________|
espao reserva
laranja
abacaxi
laranja
abacaxi
Vejamos o que aconteceu. Lida a primeira linha laranja, ela
imediatamente colocada no padro para ser manipulada:
__________________
|
|
|
laranja
|
|__________________|
espao padro
__________________
|
|
|
|
|__________________|
espao reserva
-- h -->
__________________
|
|
|
laranja
|
|__________________|
espao reserva
__________________
|
|
|
laranja
|
|__________________|
espao reserva
<-- g --
__________________
|
|
|
laranja
|
|__________________|
espao reserva
__________________
|
|
|
laranja
|
|__________________|
espao reserva
-- H -->
__________________
|
|
| laranja\nabacaxi |
|__________________|
espao reserva
__________________
|
|
| laranja\nabacaxi |
|__________________|
espao reserva
__________________
|
|
| laranja\nabacaxi |
|__________________|
espao reserva
- Registradores so simples! ;)
8.4.5. Fluxograma
=================
Para uma representao grfica dos fluxos e comandos que manipulam estes
registradores, veja o tpico Fluxos dos registradores internos.
9. Fluxogramas
==============
9.1. Fluxos do texto
====================
_________
w
|
| r
+------->| ARQUIVO |------->
|
|_________|
______|______
SADA
n
|
|
p P l
ENTRADA ------->|
S E D
|------------------->
N
|_____________|
a i c
|
| d
+-------> /dev/null
D
_________________
__________________
|
|---- h H --->|
|
| ESPAO PADRO |<--- x --->| ESPAO RESERVA |
|_________________|<--- g G ----|__________________|
http://sed.sourceforge.net/sed1line.txt
http://sed.sourceforge.net/sedfaq.html
http://www.dreamwvr.com/sed-info/sed-faq.html
http://www.rtfiber.com.tw/~changyj/sed