Escolar Documentos
Profissional Documentos
Cultura Documentos
Sed HOWTO
Verso 0.6 - junho/2009
Aurelio Marinho Jargas
1. Sobre este documento
1.1. Descrio
1.2. Anncio
1.3. Onde encontr-lo
1.4. Registro de mudanas
1.5. Agradecimentos
2. Conhecendo o sed
2.1. Descrio do Sed
2.2. O que significa a palavra Sed
2.3. Como saber se devo usar o Sed
2.3.1. Quando usar o Sed
2.3.2. Quando no usar o Sed
3. Perdendo o medo do sed
3.1. Como ele funciona
3.2. Sua sintaxe
3.2.1. Exemplo
3.2.2. Outros exemplos
3.3. Como execut-lo
4. Os comandos do sed
4.1. Descrio de todos os comandos
4.2. Lista de todos os comandos por categoria
5. Conceitos bsicos
5.1. Suprimindo a sada padro
5.1.1. Sada normal
5.1.2. Sada suprimida
5.2. O endereo
5.2.1. Endereo simples
5.2.2. Intervalo
5.2.3. Outros
5.3. Interrompendo o processamento
5.4. Invertendo a lgica
5.5. Aplicando vrios comandos de uma vez
5.5.1. Comandos normais
5.5.2. Comandos com parmetros
5.5.3. Terceira via
6. Conceitos complementares
6.1. Sed e shell
6.2. Usando outros delimitadores
6.2.1. No comando s
6.2.2. No endereo
6.3. Escapes para caracteres especiais
6.4. Gravando o resultado no mesmo arquivo
6.4.1. Problema inicial
6.4.2. Soluo genrica
6.4.3. Soluo segura
http://aurelio.net/sed/sed-HOWTO.html
1/22
16/4/2015
7. Tarefas diversas
7.1. Como substituir alguma coisa por uma quebra de linha
7.2. Apagando linhas especficas
7.3. Como ignorar maisculas e minsculas
7.4. Lendo e gravando em arquivos externos
7.4.1. Lendo arquivos
7.4.2. Gravando arquivos
7.5. Trocando um trecho de texto por outro
7.5.1. Trocar vrias linhas por uma
7.5.2. Trocar vrias linhas por outras
7.6. Emulando outros comandos
8. Conceitos avanados
8.1. Monitorando um arquivo
8.2. Colocando comandos Sed num arquivo
8.3. Tornando arquivos Sed executveis
8.4. Conhecendo os registradores internos
8.4.1. Apresentao
8.4.2. Exemplo
8.4.3. Exemplo grfico
8.4.4. Resumo
8.4.5. Fluxograma
9. Fluxogramas
9.1. Fluxos do texto
9.2. Fluxos da execuo dos comandos
9.3. Fluxos dos registradores internos
10. Nota sobre os adicionais GNU
11. Onde obter mais informaes
1.2. Anncio
Este documento algo que eu estava me devendo h sculos: uma documentao decente em
portugus sobre o Sed e seus detalhes.
o Sed HOWTO, um misto de tutorial e guia de referncia, com exemplos prticos. A idia que
sirva tanto aos principiantes quanto aos iniciados, abrangendo conceitos bsicos e complexos.
http://aurelio.net/sed/sed-HOWTO.html
2/22
16/4/2015
http://aurelio.net/sed/sed-HOWTO
Convido todos a visitarem e dar uma lida.
Alm da verso html, o documento est disponvel em texto, sgml e pdf. O sgml ainda pode ser
convertido em info, dvi, tex, lyx, rtf e xml.
Alm de uma explicao bem detalhada, "grfica" e didtica dos registradores internos e seus
comandos
Com certeza, ainda tem MUITA coisa a melhorar/acrescentar. Qualquer sugesto bem-vinda.
3/22
16/4/2015
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
Vamos conhecer um pouco o Sed, mostrar que ele no o bicho de Sed cabeas que aparenta :)
4/22
16/4/2015
http://aurelio.net/sed/sed-HOWTO.html
5/22
16/4/2015
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 via duto |, aplica o comando p
para todas as linhas do arquivo, ou seja, as duplica.
http://aurelio.net/sed/sed-HOWTO.html
6/22
16/4/2015
Com outra opo ainda, pode-se executar diretamente um arquivo com comandos Sed. Para mais
informaes, veja o tpico Tornando arquivos Sed executveis.
4. Os comandos do sed
4.1. Descrio de todos os comandos
prompt$ man sed
prompt$ pinfo sed
=
#
!
;
,
{
}
s
y
i
c
a
g
G
h
http://aurelio.net/sed/sed-HOWTO.html
7/22
16/4/2015
H
x
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.
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.
8/22
16/4/2015
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.
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:
http://aurelio.net/sed/sed-HOWTO.html
9/22
16/4/2015
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
Ou ainda, para obter apenas os cabealhos de uma mensagem de e-mail, que so separados do corpo
da mensagem por uma linha em branco:
sed '/^$/q'
A dica sempre complementar a leitura mental com o inverso (entre parnteses nos exemplos), ou
seja, se o Sed NO vai aplicar um comando em determinadas linhas, isso quer dizer implicitamente
que este comando ser aplicado em todas as outras linhas. estranho, mas acostuma :)
10/22
16/4/2015
Este comando insere a frase comeo de tudo antes da primeira linha e apaga a quinta linha do arquivo
texto.txt.
6. Conceitos complementares
Estes so conhecimentos que possivelmente surgiro como dvidas em sua cabea aps utilizar o Sed
por um tempo.
Salvo quando no meio do comando Sed, existir algo que deva ser interpretado, como uma varivel por
exemplo. Neste caso coloque os comandos entre aspas duplas:
prompt$ sed "s/$HOME/aquilo/" texto.txt
Ou ainda, para evitar completamente a interpretao do shell, sem se preocupar com aspas, coloque os
comandos Sed num arquivo. Veja o tpico Colocando comandos Sed num arquivo.
11/22
16/4/2015
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.
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
Mas muito comum, ao alterarmos um arquivo, queremos gravar estas alteraes no prprio arquivo
original. A tentativa intuitiva seria:
prompt$ sed 'comando' texto.txt > texto.txt
http://aurelio.net/sed/sed-HOWTO.html
12/22
16/4/2015
Mas s fazer para ver. Alm de no dar certo, voc ainda perder todo o contedo do arquivo.
Isso acontece porque ao fazer o redirecionamento >, o shell abre imediatamente o arquivo
referenciado, antes mesmo de comear a executar o comando Sed. E como este um
redirecionamento destrutivo > e no incremental >>, se o arquivo j existir, ele ser truncado, e seu
contedo perdido. A essa altura, o Sed comear seu processamento j lendo um arquivo texto.txt
vazio, e aplicados qualquer comandos Sed num arquivo vazio, o resultado ser o prprio arquivo
vazio.
Para a grande maioria dos casos, isso suficiente, mas convm aqui lembrar que caso o arquivo
'texto.txt' possua atributos especiais, grupo diferente do padro do usurio, ou referncias (links,
simblicos ou no) para outros arquivos, tudo isso ser perdido. Ao mover o arquivo recm-criado,
com os atributos padro do sistema, sobre o original, este perder seus atributos e ficar com os
padres do sistema, herdado do arquivo novo.
Novamente, isso s necessrio com arquivos especiais, seno a soluo com o mv pode ser usada.
Mas importante ter em mente esta outra maneira e principalmente saber o porque de utiliz-la, sendo
este conhecimento aplicvel a qualquer outro comando do sistema que leia e grave arquivos.
7. Tarefas diversas
7.1. Como substituir alguma coisa por uma quebra de linha
No Sed da GNU, a partir da verso 3.02.80(*), foi adicionado o \n como escape vlido dos dois lados
do comando s///. Com isso a tarefa de colocar cada palavra numa linha isolada, ou seja, trocar
espaos em branco por quebras de linha, fica trivial:
prompt$ sed 's/ /\n/g' texto.txt
Mas com outras verses do Sed que no entendem este escape, a quebra de linha deve ser inserida
literalmente e deve ser escapada:
prompt$ sed 's/ /\
prompt$ /g' texto.txt
Como curiosidade, a operao inversa, de colocar todas as linhas de um arquivo numa linha s, j
mais trabalhosa e utiliza o conceito de lao:
http://aurelio.net/sed/sed-HOWTO.html
13/22
16/4/2015
Para apagar todas as linhas que contm a palavra root, ROOT, RooT etc.
No Sed da GNU, a partir da verso 3.01-beta1(*), foi adicionado o modificador I no endereo e no
comando s///, fazendo com que o comando acima fique mais simples:
prompt$ sed '/root/Id' texto.txt
Ou ainda:
prompt$ sed 's/root/administrador/Ig' 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.
14/22
16/4/2015
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.
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 o texto na mesma linha:
prompt$ sed '/<pre>/,/<\/pre>/c aqui tinha texto pr-formatado' texto.html
sed '/<pre>/,/<\/pre>/c \
aqui tinha texto pr-formatado,\
mas eu resolvi tirar.\
porque?\
porque sim' texto.html
claro, quando o comando comea a ficar grande desse jeito, melhor coloc-lo num arquivo. Saiba
mais detalhes sobre isso no tpico Colocando comandos sed num arquivo.
Mas melhor ainda separar o comando Sed do texto, colocando-o num arquivo separado. Assim,
quando se precisar alterar este texto, basta edit-lo, sem mudar o comando Sed, e sem precisar ficar
colocando \ no final de cada linha.
Supondo que nosso texto explicativo do porqu da retirada do texto pr-formatado foi gravado no
arquivo desculpa.txt, utilizaremos o comando r para l-lo e o comando d para apagar o texto antigo:
prompt$ sed -e '/<\/pre>/r desculpa.txt' -e '/<pre>/,/<\/pre>/d' texto.html
Ento acompanhe o que acontece: o primeiro comando ser executado apenas na linha </pre> que o
fechamento do trecho, ento vamos esquecer dele por enquanto. O segundo comando diz para apagar
o trecho desde <pre> at </pre>, ento assim que comear o trecho, ele vai apagando, linha por linha.
http://aurelio.net/sed/sed-HOWTO.html
15/22
16/4/2015
Ao chegar na linha que contm o </pre>, o primeiro comando Sed entra em ao e l o arquivo
desculpa.txt, colocando seu contedo imediatamente aps a linha atual. Em seguida, o segundo
comando apaga a linha </pre>, completando a tarefa.
Esta segunda soluo mais difcil de entender e implementar, mas muito mais prtica caso a
alterao do texto a ser colocado seja freqente, alm destas alteraes poderem ser feitas por algum
que nem saiba o que Sed, pois ser apenas um texto normal.
Note que sempre que o </pre> foi referenciado nos endereos, a barra foi escapada, ficando <\/pre>.
A explicao desse escape est em Usando outros delimitadores
obs.: talvez o <pre></pre> no seja um exemplo dos mais didticos, mas no me veio algo mais
comum mente...
8. Conceitos avanados
Estes so conhecimentos necessrios queles que fazem uso intensivo do Sed, fazendo programas
grandes e/ou complexos.
16/22
16/4/2015
Para dizer ao Sed para utilizar aquele arquivo como fonte de comandos, basta usar a opo -f
prompt$ sed -f programa.sed texto.txt
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
17/22
16/4/2015
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
O anexando acima significa "no sobrescreve o contedo original", ou seja, ele mantm o que j tem,
e adiciona um \n (quebra de linha), seguido do texto manipulado. Para entender melhor, veja o
exemplo grfico a seguir.
8.4.2. Exemplo
Um exemplo didtico de uso do espao reserva ir guardando nele algumas linhas do texto e mostrlas depois no final do arquivo:
prompt$ sed '/root/H;$g' /etc/passwd
Ou seja, adicione no espao reserva (comando H), as linhas que contm a palavra root e na ltima
linha do arquivo (endereo $), recupere o contedo do espao reserva (comando g).
__________________
|
|
|
|
|__________________|
espao reserva
E um arquivo hipottico com o contedo: (no so odiosos estes exemplos com frutas?)
laranja
uva
abacaxi
melancia
mimosa
E aplicaremos o comando:
sed '/laranja/h ; /uva/g ; /abacaxi/H ; /melancia/G ; /mimosa/x'
18/22
16/4/2015
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
Como mais nenhum comando relativo linha laranja, o Sed d por encerrado o processamento
dessa linha e imprime o contedo do padro na sada: "laranja".
Beleza, agora ele vai processar a segunda linha, novamente a primeira coisa coloc-la no padro,
sobrescrevendo o que tinha antes:
__________________
|
|
|
uva
|
|__________________|
espao padro
__________________
|
|
|
laranja
|
|__________________|
espao reserva
O reserva, enquanto nenhum outro comando escrever nele, permanecer o mesmo. O comando
direcionado linha uva o g, que pega o contedo do reserva e o coloca no padro, apagando o que
estiver nele (neste caso: uva):
__________________
|
|
|
laranja
|
|__________________|
espao padro
<-- g --
__________________
|
|
|
laranja
|
|__________________|
espao reserva
Novamente, no h mais comandos a ser executados, ento imprime na sada o contedo do padro:
"laranja".
Indo para a terceira linha e colocando-a no padro:
__________________
|
|
|
abacaxi
|
|__________________|
espao padro
__________________
|
|
|
laranja
|
|__________________|
espao reserva
O comando dessa linha o H, que tal como o h, guarda o contedo do padro no reserva, com
diferena que ele preserva o contedo j existente dele, separando com um \n:
|
|
__________________
abacaxi
http://aurelio.net/sed/sed-HOWTO.html
|
|
-- H -->
__________________
|
|
| laranja\nabacaxi |
19/22
16/4/2015
|__________________|
espao padro
|__________________|
espao reserva
__________________
|
|
| laranja\nabacaxi |
|__________________|
espao reserva
E agora vai ficar divertido, aplicando o comando G, que pega o contedo do reserva e anexa ao
padro:
____________________________
|
|
| melancia\nlaranja\nabacaxi |
|____________________________|
espao padro
<-G--
__________________
|
|
| laranja\nabacaxi |
|__________________|
espao reserva
E a sada agora fica "melancia\nlaranja\nabacaxi", com o detalhe que o Sed troca estes \n por quebras
de linha na impresso. Ento so 3 linhas na sada. V acompanhando com o resultado que j foi
cantado antecipadamente l em cima.
E finalmente, a ltima linha:
__________________
|
|
|
mimosa
|
|__________________|
espao padro
__________________
|
|
| laranja\nabacaxi |
|__________________|
espao reserva
<-- x --->
__________________
|
|
|
mimosa
|
|__________________|
espao reserva
8.4.4. Resumo
Cada linha nova lida colocada (sobrescrevendo) no espao padro
Uma vez colocado algo no espao reserva, fica l at ser sobrescrito
O \n o separador do contedo original com o anexo
Na sada, o \n vira quebra de linha
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.
http://aurelio.net/sed/sed-HOWTO.html
20/22
16/4/2015
9. Fluxogramas
9.1. Fluxos do texto
ENTRADA
_________
w
|
|
r
+------->| ARQUIVO |------->
|
|_________|
______|______
n
|
|
p P l
------->|
S E D
|------------------->
N
|_____________|
a i c
|
|
d
+-------> /dev/null
D
SADA
21/22
16/4/2015
Mas o preo de se usar essas funcionalidades que se perde em compatibilidade, pois seu programa
Sed no funcionar em UNIXes ou outros sistemas que usem um Sed que no o da GNU.
Para a grande maioria dos usurios isso no far diferena pois geralmente trabalham com apenas um
tipo de sistema operacional, mas o recado fica dado.
http://aurelio.net/sed/sed-HOWTO.html
22/22