Você está na página 1de 22

16/4/2015

Sed HOWTO :: aurelio.net

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

Sed HOWTO :: aurelio.net

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. Sobre este documento


1.1. Descrio
Este documento se prope a ser um tutorial e um guia de consulta de Sed ao mesmo tempo.
Tutorial porque ele vai lhe apresentando o Sed aos poucos, explicando seu funcionamento.
Guia de consulta porque ele tem dicas avanadas e descreve truques especficos que s sero
assimilados e compreendidos executando-os na prtica.
Este documento NO abordar as Expresses Regulares, que so um tema complexo, e embora faam
parte da essncia do Sed, seu funcionamento independe delas.
Resumindo, o Sed HOWTO fala sobre Sed.
Este documento pode (deve) ser distribudo vontade.

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

Sed HOWTO :: aurelio.net

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.

1.3. Onde encontr-lo


A casa oficial deste documento na seo Sed do Site do Aurelio. Voc pode consult-lo on-line ou
baix-lo para leitura local em quaisquer dos formatos seguintes:
formato
endereo
detalhe
online http://aurelio.net/sed/sed-HOWTO/
vrias pginas
impresso http://aurelio.net/sed/sed-HOWTO.html tudo-em-um
txt
http://aurelio.net/sed/sed-HOWTO.txt verso texto

1.4. Registro de mudanas


2009-06-26 v0.6
Documento convertido para UTF-8
A verso HTML de uma nica pgina agora vem sem formatao (CSS) para facilitar a
impresso
Removidas as verses PDF e SGML deste documento, para facilitar sua manuteno
Todos os links externos foram verificados e atualizados
Agora as referncias internas para outros tpicos so links
Padronizado o nome "Sed" em vez de "sed" e "SED" ao referir-se ao programa
Adicionado link e melhorada a tabela em Emulando outros comandos
Melhorias nos desenhos ASCII (curvas com + e alinhamento)
Melhorias de formatao na lista de agradecimentos
2003-04-15 v0.5
Listagem dos comandos adicionada em Descrio de todos os comandos
Mudanas cosmticas, URLs atualizadas, s/endereamento/endereo/g
Adicionada verso HTML (tudo em uma pgina) e retirada a verso em PostScript (basta
fazer sgml2latex -o ps sed-HOWTO.sgml)
Retirado tambm o .tgz do ar
O txt2tags (http://txt2tags.sf.net) agora o conversor utilizado para gerar o Sed HOWTO
- acabaram os ttulos em CAPSLOCK
2001-02-02 v0.4
Documento disponibilizado agora tambm em ps e pdf
Mais info na seo Anncio, sobre os formatos novos
2000-12-03 v0.3
http://aurelio.net/sed/sed-HOWTO.html

3/22

16/4/2015

Sed HOWTO :: aurelio.net

Criada seo Trocando um trecho de texto por outro


Criada seo Fluxos da execuo dos comandos
Criada seo Onde encontr-lo
Exemplo grfico didtico em Conhecendo os registradores internos
Informaes mais didticas na seo Como ele funciona
Documento disponibilizado em txt e sgml
Vrias correes pequenas nos textos
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
Vamos conhecer um pouco o Sed, mostrar que ele no o bicho de Sed cabeas que aparenta :)

2.1. Descrio do Sed


O Sed um editor de textos no interativo.
Ele pode editar automaticamente, sem interao do usurio, vrios arquivos seguindo um conjunto de
regras especificadas.

2.2. O que significa a palavra Sed


http://aurelio.net/sed/sed-HOWTO.html

4/22

16/4/2015

Sed HOWTO :: aurelio.net

Vem do ingls "Stream EDitor", ou seja, editor de fluxos (de texto).

2.3. Como saber se devo usar o Sed


Sendo um editor de textos no interativo, o Sed excelente para desempenhar algumas tarefas, mas
em outras seu uso no aconselhado.

2.3.1. Quando usar o Sed


A caracterstica principal do Sed poder editar arquivos automaticamente.
Ento sempre que voc precisar fazer alteraes sistemticas em vrios arquivos, o Sed uma soluo
eficaz.
Por exemplo, voc tem um diretrio cheio de relatrios de vendas, e descobriu que por um erro na
gerao, todas as datas saram erradas, com o ano de 1999 onde era para ser 2000. Num editor de
textos normal, voc tem que abrir os relatrios um por um e alterar o ano em todas as ocorrncias.
Certo, isso no to complexo se o editor de textos possuir uma ferramenta de procura e troca,
tambm chamado de substituio.
Mas ento suponhamos que o erro da data no seja o ano, e sim o formato, tendo sado como
mm/dd/aaaa quando deveria ser dd/mm/aaaa. Aqui no uma substituio e sim uma troca de
lugares, e uma ferramenta simples de procura e troca no poder ajudar.
Esse um caso tpico onde o Sed mostra seu poder: alteraes complexas em vrios arquivos.
Utilizando o Sed, a soluo para este problema (que veremos adiante) at simples, bastando definir
uma srie de regras de procura e troca, e o programa se encarregar de execut-las e arrumar os
relatrios.

2.3.2. Quando no usar o Sed


Nenhuma ferramenta ideal para todas as tarefas, e o Sed no uma exceo regra.
2.3.2.1. Edio genrica de textos
Ele no prtico para ser utilizado como editor de textos de uso genrico.
Para escrever textos, ou alterar coisas simples, mais rpido e fcil abrir um editor de textos
interativo como o vi ou o emacs e fazer a alterao "na mo".
2.3.2.2. Programao avanada
O Sed no uma linguagem de programao completa, pois no possui variveis, funes
matemticas, interao com o sistema operacional, entre outras limitaes. Mas bem, ele um
manipulador de texto e no uma linguagem de uso geral.
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.

http://aurelio.net/sed/sed-HOWTO.html

5/22

16/4/2015

Sed HOWTO :: aurelio.net

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 via duto |, aplica o comando p
para todas as linhas do arquivo, ou seja, as duplica.

3.2.2. Outros exemplos


Um outro exemplo do Sed com opes e recebendo um arquivo como parmetro seria:
prompt$ sed -n p texto.txt

http://aurelio.net/sed/sed-HOWTO.html

6/22

16/4/2015

Sed HOWTO :: aurelio.net

E ainda, agora especificando um endereo para o comando p:


prompt$ sed -n 5p texto.txt

Ou seja, este comando imprime apenas a linha 5 do texto.txt

3.3. Como execut-lo


A execuo do Sed igual a de outro aplicativo qualquer de manipulao de texto, aceitando como
parmetro um nome de arquivo, ou na falta deste, l o texto da entrada padro, via duto | ou
redirecionamento <.
E como dica geral SEMPRE coloque os comandos do Sed entre aspas simples '', para evitar que o
shell os interprete erroneamente. Veja mais detalhes no tpico Sed e shell.
prompt$ sed 'p' texto.txt
prompt$ cat texto.txt | sed 'p'
prompt$ sed 'p' < texto.txt

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

Ou num resumo rpido:


Legenda:
[ARQUIVO]
[TEXTO]
[PADRO]

arquivo ou fluxo de texto (via pipe) original a ser modificado


trecho de texto. pode ser uma palavra, uma linha,
vrias separadas por \n, ou mesmo um vazio.
[TEXTO] contido no ESPAO PADRO

=
#
!
;
,
{
}

imprime o nmero da linha atual do [ARQUIVO]


inicia um comentrio
inverte a lgica do comando
separador de comandos
separador de faixas de endereo
incio de bloco de comandos
fim de bloco de comandos

s
y

substitui um trecho de texto por outro


traduz um caractere por outro

i
c
a

insere um texto antes da linha atual


troca a linha atual por um texto
anexa um texto aps a linha atual

g
G
h

restaura o [TEXTO] contido no ESPAO RESERVA (sobrescrevendo)


restaura o [TEXTO] contido no ESPAO RESERVA (anexando)
guarda o [PADRO] no ESPAO RESERVA (sobrescrevendo)

http://aurelio.net/sed/sed-HOWTO.html

7/22

16/4/2015

Sed HOWTO :: aurelio.net

H
x

guarda o [PADRO] no ESPAO RESERVA (anexando)


troca os contedos dos ESPAO PADRO e RESERVA

p
P
l

imprime o [PADRO]
imprime a primeira linha do [PADRO]
imprime o [PADRO] mostrando caracteres brancos

r
w

inclui contedo de um arquivo antes da linha atual


grava o [PADRO] num arquivo

:
b
t

define uma marcao


pula at uma marcao
pula at uma marcao, se o ltimo s/// funcionou (condicional)

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

4.2. Lista de todos os comandos por categoria


informaes
marcadores
comentrios
comandos de edio
comandos de registradores
comandos de impresso
comandos de arquivo
modificadores
separadores
controle de fluxo
endereo
limitadores
registradores dinmicos

=
:
#
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


http://aurelio.net/sed/sed-HOWTO.html

8/22

16/4/2015

Sed HOWTO :: aurelio.net

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:
http://aurelio.net/sed/sed-HOWTO.html

9/22

16/4/2015

Sed HOWTO :: aurelio.net

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'

ao chegar na linha 10, pare.

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'

pare na primeira linha em branco que achar

5.4. Invertendo a lgica


No Sed temos o modificador ! que inverte a lgica do comando, ou seja !comando significa "no
execute o comando". meio estranho a primeira vista, mas voc tem que comear a pensar como o
Sed, e tudo se esclarece :)
Temos o comando head que imprime as 10 primeiras linhas de um arquivo. Com as dicas j vistas,
podemos fazer esta tarefa com o Sed assim:
sed -n '1,10p'
sed '11,$d'

imprima apenas da linha 1 at a 10


apague da linha 11 at o final

Ou ainda, podemos inverter a lgica e fazer:


sed '1,10!d'
sed -n '11,$!p'

NO apague da linha 1 at a 10 (ou seja, apague as outras)


NO imprima da linha 11 at o final (ou seja, imprima as outras)

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 :)

5.5. Aplicando vrios comandos de uma vez


5.5.1. Comandos normais
possvel aplicar vrios comandos Sed, em seqncia. Basta separ-los por ponto-e-vrgula.
prompt$ sed '5d;10d;/estorvo/d' texto.txt

Este comando apaga as linhas 5, 10 e as que tm estorvo do arquivo texto.txt.


http://aurelio.net/sed/sed-HOWTO.html

10/22

16/4/2015

Sed HOWTO :: aurelio.net

5.5.2. Comandos com parmetros


Os comandos que recebem parmetros (r, w, i, a, c), no aceitam o ponto-e-vrgula como separador,
pois este pode ser parte integrante do parmetro esperado.
Estes comandos devem ser separados dos restantes, sendo passados como comandos isolados, pela
opo de linha de comando -e:
prompt$ sed -e '1i comeo de tudo' -e '5d' texto.txt

Este comando insere a frase comeo de tudo antes da primeira linha e apaga a quinta linha do arquivo
texto.txt.

5.5.3. Terceira via


Outra maneira de especificar vrios comandos (e a mais consistente e garantida) coloc-los num
arquivo, um por linha. Veja o tpico Colocando comandos Sed num arquivo.

6. Conceitos complementares
Estes so conhecimentos que possivelmente surgiro como dvidas em sua cabea aps utilizar o Sed
por um tempo.

6.1. Sed e shell


Com o Sed sendo invocado na linha de comando, deve-se ter alguns cuidados para evitar transtornos.
O interpretador de comandos (shell), interpreta a linha de comando antes de process-la, ento alguns
caracteres especiais como $, \ e !, so interpretados pelo shell antes de chegarem ao Sed, modificando
o comportamento esperado.
Para evitar isso coloque os comandos Sed sempre entre aspas simples:
prompt$ sed 's/isso/aquilo/' texto.txt

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.

6.2. Usando outros delimitadores


6.2.1. No comando s
comum ao fazer um comando de substituio s/// conter uma / num dos dois lados do comando,
como quando querendo substituir /usr/local/bin por /usr/bin.
Sendo a barra o delimitador do comando s as outras barras comuns devem ser escapadas com a barra
invertida \, para no serem confundidas com os delimitadores normais, ficando o monstro a seguir:
http://aurelio.net/sed/sed-HOWTO.html

11/22

16/4/2015

Sed HOWTO :: aurelio.net

prompt$ sed 's/\/usr\/local\/bin/\/usr\/bin/' texto.txt

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

(*) veja o tpico Nota sobre os adicionais GNU

6.4. Gravando o resultado no mesmo arquivo


6.4.1. Problema inicial
O procedimento comum quando se quer gravar num arquivo o resultado de um comando Sed, o
redirecionamento:
prompt$ sed 'comando' texto.txt > texto-alterado.txt

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

Sed HOWTO :: aurelio.net

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.

6.4.2. Soluo genrica


Para evitar isso, voltamos a primeira ttica de gravar o resultado num outro arquivo, e depois o mais
natural mover o arquivo novo sobre o original:
prompt$ sed 'comando' texto.txt > texto-alterado.txt
prompt$ mv texto-alterado.txt texto.txt

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.

6.4.3. Soluo segura


Para evitar isso, a abordagem mais ortodoxa e segura seria aplicar o comando Sed numa cpia e
gravar o resultado no arquivo original via redirecionamento:
prompt$ cp -a texto.txt texto-tmp.txt
prompt$ sed 'comando' texto-tmp.txt > texto.txt
prompt$ rm texto-tmp.txt

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

Sed HOWTO :: aurelio.net

prompt$ sed ':a;$!N;s/\n/ /g;ta'

(*) veja o tpico Nota sobre os adicionais GNU

7.2. Apagando linhas especficas


O comando para apagar linhas o d.
O nico detalhe nesta tarefa especificar quais linhas voc vai querer apagar. Isso est
completamente coberto no tpico O endereo.

7.3. Como ignorar maisculas e minsculas


O jeito padro do Sed ser "ignore-case", dizendo literalmente todas as possibilidades, como em:
prompt$ sed '/[Rr][Oo][Oo][Tt]/d' texto.txt

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

(*) veja o tpico Nota sobre os adicionais GNU

7.4. Lendo e gravando em arquivos externos


7.4.1. Lendo arquivos
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
http://aurelio.net/sed/sed-HOWTO.html

14/22

16/4/2015

Sed HOWTO :: aurelio.net

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 o texto na mesma linha:
prompt$ sed '/<pre>/,/<\/pre>/c aqui tinha texto pr-formatado' texto.html

(*) veja o tpico Nota sobre os adicionais GNU

7.5.2. Trocar vrias linhas por outras


Similarmente a trocar por apenas uma linha, pode-se usar o comando c e passar vrias linhas para ele.
O nico detalhe que todas as linhas devem ser escapadas no final, menos a ltima:
prompt$
prompt$
prompt$
prompt$
prompt$

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

Sed HOWTO :: aurelio.net

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...

7.6. Emulando outros comandos


Aqui vo alguns exemplos de emulaes de outros comandos usando-se o Sed:
comando
emulao
cat
sed :
head
sed 10q
grep
sed /padro/!d
grep -v sed /padro/d
tac
sed 1!G;h;$!d
tail -1
sed $!d
tr A-Z a-z sed y/ABCDEF...UVWXYZ/abcdef...uvwxyz/
wc -l
sed -n $=
A lista completa e atualizada pode ser encontrada em:
http://sed.sourceforge.net/local/docs/emulating_unix.txt

8. Conceitos avanados
Estes so conhecimentos necessrios queles que fazem uso intensivo do Sed, fazendo programas
grandes e/ou complexos.

8.1. Monitorando um arquivo


No Sed da GNU, a partir da verso 3.02.80(*), foi adicionada a opo -u, que significa "unbuffered",
ou seja, faz um uso minimalista dos registradores, mostrando a sada o mais rpido possvel, tornando
possvel editar um fluxo interminvel como o gerado por um tail -f.
Um exemplo prtico seria mostrar apenas as mensagens do sistema relativas s conexes ssh:
prompt$ tail -f /var/log/messages | sed -nu '/sshd/p'

Cuidado com -nu perto de crianas! :)


(*) veja o tpico Nota sobre os adicionais GNU
http://aurelio.net/sed/sed-HOWTO.html

16/22

16/4/2015

Sed HOWTO :: aurelio.net

8.2. Colocando comandos Sed num arquivo


Como os comandos Sed vo ficando extensos e complicados, conveniente coloc-los num arquivo,
com estruturao e comentrios.
Voc pode espalhar os comandos por vrias linhas, trocando o ; por quebras de linha e colocar
comentrios precedidos de #. O exemplo de apagar linhas ficaria:
# programa.sed: apaga algumas linhas
# apaga a 5 linha
5d
# apaga a 10 linha
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.
http://aurelio.net/sed/sed-HOWTO.html

17/22

16/4/2015

Sed HOWTO :: aurelio.net

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

guarda no espao reserva


guarda (anexando) no espao reserva

g
G

pega o contedo do espao reserva


pega (anexando) o contedo do espao reserva

troca os contedos dos 2 registradores

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).

8.4.3. Exemplo grfico


Como os registradores so a parte mais obscura do Sed (mais por falta de documentao do que por
complexidade), merecem uma explicao bem didtica. Vamos l.
Temos os dois registradores vazios: (que daqui pra frente sero chamados apenas de padro e
reserva)
__________________
|
|
|
|
|__________________|
espao padro

__________________
|
|
|
|
|__________________|
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'

Obtendo como resultado:


laranja
laranja
abacaxi
melancia
http://aurelio.net/sed/sed-HOWTO.html

18/22

16/4/2015

Sed HOWTO :: aurelio.net

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

O comando direcionado a ela o h, que guarda uma cpia dela no reserva:


__________________
|
|
|
laranja
|
|__________________|
espao padro

-- 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

Sed HOWTO :: aurelio.net

|__________________|
espao padro

|__________________|
espao reserva

Novamente, chegou ao fim, imprime o padro: "abacaxi". a prxima linha a da melancia:


__________________
|
|
|
melancia
|
|__________________|
espao padro

__________________
|
|
| 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

E para ela, o comando que troca o contedo dos 2 registradores, o x:


__________________
|
|
| laranja\nabacaxi |
|__________________|
espao padro

<-- x --->

__________________
|
|
|
mimosa
|
|__________________|
espao reserva

E mostra na sada o padro, com duas linhas: "laranja" e "abacaxi".


Ufa! Depois dessa no venha me dizer que no sabe como funcionam os registradores internos do Sed
;)

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

Sed HOWTO :: aurelio.net

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

9.2. Fluxos da execuo dos comandos


_________
|
|
______| prxima |<---+
/
| linha |
|
|
|_________|
|
|
|
v
d D | n N
_____|______
|
|
COMEO
--------->| COMANDOS |----------> FIM DO PROGRAMA
|____________| q
|
^
b | t
|
|
|
|
___|______
|
|
|
+-->| marcao |
|__________|

9.3. Fluxos dos registradores internos


_________________
__________________
|
|---- h H --->|
|
| ESPAO PADRO |<--- x --->| ESPAO RESERVA |
|_________________|<--- g G ----|__________________|

Veja explicao sobre estes registradores no tpico Conhecendo os registradores internos.

10. Nota sobre os adicionais GNU


O Sed da GNU, atualmente o utilizado pela maioria das distribuies de Linux e o que tem mais
funcionalidades novas.
http://aurelio.net/sed/sed-HOWTO.html

21/22

16/4/2015

Sed HOWTO :: aurelio.net

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.

11. Onde obter mais informaes


Informaes em portugus:
http://aurelio.net/sed
Informaes em ingls:
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
ltima verso em desenvolvimento do Sed:
ftp://alpha.gnu.org/gnu/sed

http://aurelio.net/sed/sed-HOWTO.html

22/22

Você também pode gostar