Você está na página 1de 24

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
2.3.2.1. Edio genrica de textos
2.3.2.2. Programao avanada
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
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 (http://aurelio.net/er),
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
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
| online
| impresso
|
txt

|
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

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

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

o [TEXTO] contido no ESPAO RESERVA (sobrescrevendo)


o [TEXTO] contido no ESPAO RESERVA (anexando)
[PADRO] no ESPAO RESERVA (sobrescrevendo)
[PADRO] no ESPAO RESERVA (anexando)
contedos dos ESPAO PADRO e RESERVA

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

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.
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:
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
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
o mv pode ser usada.
principalmente saber
aplicvel a qualquer

necessrio com arquivos especiais, seno a soluo com


Mas importante ter em mente esta outra maneira e
o porque de utiliz-la, sendo este conhecimento
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:
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
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:
linha </pre> que o fechamento
enquanto. O segundo comando diz
</pre>, ento assim que comear
linha.

o primeiro comando ser executado apenas na


do trecho, ento vamos esquecer dele por
para apagar o trecho desde <pre> at
o trecho, ele vai apagando, linha por

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

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

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

-- H -->

__________________
|
|
| laranja\nabacaxi |
|__________________|
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 | <-G-- | laranja\nabacaxi |
|____________________________|
|__________________|
espao padro
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 | <-- x ---> |
mimosa
|
|__________________|
|__________________|
espao padro
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.
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

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