Sed HOWTO

Versão 0.6 - junho/2009
Aurelio Marinho Jargas
-----------------------------------------------------------------------1. Sobre este documento
1.1. Descrição
1.2. Anúncio
1.3. Onde encontrá-lo
1.4. Registro de mudanças
1.5. Agradecimentos
2. Conhecendo o sed
2.1. Descrição 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 não usar o Sed
2.3.2.1. Edição genérica de textos
2.3.2.2. Programação avançada
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. Descrição de todos os comandos
4.2. Lista de todos os comandos por categoria
5. Conceitos básicos
5.1. Suprimindo a saída padrão
5.1.1. Saída normal
5.1.2. Saída suprimida
5.2. O endereço
5.2.1. Endereço simples
5.2.2. Intervalo
5.2.3. Outros
5.3. Interrompendo o processamento
5.4. Invertendo a lógica
5.5. Aplicando vários comandos de uma vez
5.5.1. Comandos normais
5.5.2. Comandos com parâmetros
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 endereço
6.3. Escapes para caracteres especiais
6.4. Gravando o resultado no mesmo arquivo
6.4.1. Problema inicial
6.4.2. Solução genérica
6.4.3. Solução segura
7. Tarefas diversas
7.1. Como substituir alguma coisa por uma quebra de linha
7.2. Apagando linhas específicas
7.3. Como ignorar maiúsculas e minúsculas
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 várias linhas por uma
7.5.2. Trocar várias linhas por outras
7.6. Emulando outros comandos
8. Conceitos avançados
8.1. Monitorando um arquivo
8.2. Colocando comandos Sed num arquivo
8.3. Tornando arquivos Sed executáveis
8.4. Conhecendo os registradores internos
8.4.1. Apresentação
8.4.2. Exemplo
8.4.3. Exemplo gráfico
8.4.4. Resumão
8.4.5. Fluxograma
9. Fluxogramas
9.1. Fluxos do texto
9.2. Fluxos da execução dos comandos
9.3. Fluxos dos registradores internos
10. Nota sobre os adicionais GNU
11. Onde obter mais informações
-----------------------------------------------------------------------1. Sobre este documento
=======================
1.1. Descrição
==============
Este documento se propõe 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 avançadas e descreve truques
específicos que só serão assimilados e compreendidos executando-os na
prática.
Este documento NÃO abordará as Expressões Regulares (http://aurelio.net/er),
que são um tema complexo, e embora façam parte da essência do Sed,
seu funcionamento independe delas.
Resumindo, o Sed HOWTO fala sobre Sed.
Este documento pode (deve) ser distribuído à vontade.
1.2. Anúncio
============
Este documento é algo que eu estava me devendo há séculos: uma
documentação decente em português sobre o Sed e seus detalhes.
É o Sed HOWTO, um misto de tutorial e guia de referência, com
exemplos práticos. A idéia é que sirva tanto aos principiantes

sobre os formatos novos 2000-12-03 — v0.Melhorias de formatação na lista de agradecimentos 2003-04-15 — v0. Qualquer sugestão é bem-vinda. o documento está disponível em texto.Criada seção Trocando um trecho de texto por outro .Documento disponibilizado agora também em ps e pdf .net/sed/sed-HOWTO Convido todos a visitarem e dar uma lida.tgz do ar .Todos os links externos foram verificados e atualizados . O sgml ainda pode ser convertido em info.6 . rtf e xml.net/sed/sed-HOWTO.5 . dvi.4 .A versão HTML de uma única página agora vem sem formatação (CSS) para facilitar a impressão . sgml e pdf.Adicionada versão HTML (tudo em uma página) e retirada a versão em PostScript (basta fazer sgml2latex -o ps sed-HOWTO. Onde encontrá-lo ===================== A casa oficial deste documento é na seção Sed do Site do Aurelio.sf.quanto aos iniciados.Mudanças cosméticas.Mais info na seção Anúncio.Adicionado link e melhorada a tabela em Emulando outros comandos .html | http://aurelio.sgml) .net/sed/sed-HOWTO.net) agora é o conversor utilizado para gerar o Sed HOWTO . para facilitar sua manutenção . s/endereçamento/endereço/g . Além de uma explicação bem detalhada.Agora as referências internas para outros tópicos são links .O txt2tags (http://txt2tags. URLs atualizadas. "gráfica" e didática dos registradores internos e seus comandos Com certeza.Retirado também o .4. abrangendo conceitos básicos e complexos.3.Padronizado o nome "Sed" em vez de "sed" e "SED" ao referir-se ao programa .Documento convertido para UTF-8 .txt | detalhe | várias páginas | tudo-em-um | versão texto 1. 1. http://aurelio. tex.net/sed/sed-HOWTO/ | http://aurelio. ainda tem MUITA coisa a melhorar/acrescentar. Além da versão html.acabaram os títulos em CAPSLOCK 2001-02-02 — v0.Removidas as versões PDF e SGML deste documento.Melhorias nos desenhos ASCII (curvas com + e alinhamento) . lyx.Listagem dos comandos adicionada em Descrição de todos os comandos . Registro de mudanças ========================= 2009-06-26 — v0.3 . Você pode consultá-lo on-line ou baixá-lo para leitura local em quaisquer dos formatos seguintes: || formato | online | impressão | txt | endereço | http://aurelio.

Ele pode editar automaticamente. O que significa a palavra Sed ======================================== Vem do inglês "Stream EDitor". sem interação do usuário.1 . via e-mail ou internet.2.*@conectiva .1.BR Thobias Salazar Trevisan Tiago Barros & senha. ou ajudaram na divulgação. editor de fluxos (de texto).Criada seção Registro de mudanças . Descrição do Sed =========================== O Sed é um editor de textos não interativo.2 . - .5.- Criada seção Fluxos da execução dos comandos Criada seção Onde encontrá-lo Exemplo gráfico didático em Conhecendo os registradores internos Informações mais didáticas na seção Como ele funciona Documento disponibilizado em txt e sgml Várias correções pequenas nos textos 2000-09-13 — v0. ou seja.*@lista_sed-users Carlos Alvsan Eduardo Mendes Rafael Steil Rodrigo Bernardo Pimentel Rubens Queiroz de Almeida & Dicas-l Sérgio Bruder & . 2. Conhecendo o sed =================== Vamos conhecer um pouco o Sed.Disponibilização na internet 1.Disponibilizado este documento em HTML compactado .org 2.Retirada entrada duplicada na seção Emulando outros comandos 2000-08-2 — v0. enviaram sugestões e correções. . vários arquivos seguindo um conjunto de regras especificadas.1ª versão . mostrar que ele não é o bicho de Sed cabeças que aparenta :) 2.Criada seção Anúncio .Criada seção Agradecimentos .*@lista_sed-br . Agradecimentos =================== Meus agradecimentos sinceros àqueles que comentaram.

mas em outras seu uso não é aconselhado. funções matemáticas. 2. Mas então suponhamos que o erro da data não seja o ano. o Sed é excelente para desempenhar algumas tarefas. 2. interação com o sistema operacional.1.2. você tem um diretório cheio de relatórios de vendas.3. Programação avançada ============================= O Sed não é uma linguagem de programação completa.2. também chamado de substituição. Mas bem. e o Sed não é uma exceção à regra. pois não possui variáveis. todas as datas saíram erradas. isso não é tão complexo se o editor de textos possuir uma ferramenta de procura e troca. Num editor de textos normal.3. bastando definir uma série de regras de procura e troca.3. 2. é mais rápido e fácil abrir um editor de textos interativo como o vi ou o emacs e fazer a alteração "na mão". Quando não usar o Sed ================================== Nenhuma ferramenta é ideal para todas as tarefas. Por exemplo. ou alterar coisas simples. Para escrever textos. o Sed é uma solução eficaz.3.1. e descobriu que por um erro na geração. e o programa se encarregará de executá-las e arrumar os relatórios. Esse é um caso típico onde o Sed mostra seu poder: alterações complexas em vários arquivos. . Como saber se devo usar o Sed ======================================== Sendo um editor de textos não interativo. Aqui não é uma substituição e sim uma troca de lugares.2. Edição genérica de textos ================================== Ele não é prático para ser utilizado como editor de textos de uso genérico. com o ano de 1999 onde era para ser 2000. e sim o formato.2. Utilizando o Sed.3. ele é um manipulador de texto e não uma linguagem de uso geral. entre outras limitações. Então sempre que você precisar fazer alterações sistemáticas em vários arquivos. e uma ferramenta simples de procura e troca não poderá ajudar. tendo saído como mm/dd/aaaa quando deveria ser dd/mm/aaaa. você tem que abrir os relatórios um por um e alterar o ano em todas as ocorrências. 2. Quando usar o Sed ============================== A característica principal do Sed é poder editar arquivos automaticamente. Certo. a solução para este problema (que veremos adiante) é até simples.2.

2. por onde você passa um texto X e ele joga na saída um texto Y. Como ele funciona ====================== O Sed funciona como um filtro. Perdendo o medo do sed ========================= 3. .1. . Exemplo ============== Como notação tradicional. o que está [entre colchetes] é opcional. Pense no Sed como um processador de alimentos. 3. a batata sai cortada de uma maneira diferente :) . aplica os comandos de edição e mostra o resultado na saída padrão (STDOUT). mas se o seu programa em Sed começou a inchar muito.2.o Sed lê uma linha da entrada padrão (STDIN) ou de um arquivo especificado. .Algumas estruturas complexas podem ser simuladas com alguma técnica.txt | sed p Ou seja. Sua sintaxe ================ A sintaxe genérica de um comando Sed é: sed [opções] regras [arquivo] Sendo que regras tem a forma genérica de: [endereço1 [. . ou conversor. da esquerda para a direita. .o Sed faz uso intensivo de expressões regulares. dependendo da lâmina utilizada. endereço2]] comando [argumento] 3. então a sintaxe Sed mais simples que existe é sed regra como em: prompt$ cat texto. é aconselhável reescrevê-lo numa linguagem com mais recursos.o Sed é orientado a linha.o Sed aceita endereços para os comandos. como o perl.txt . O texto X virou Y seguindo algumas regrinhas que você determinou.o Sed aplica os comandos para todas as linhas caso um endereço não seja especificado.o Sed funciona como um filtro.1. de cima para baixo. . o Sed lendo da entrada padrão o conteúdo do arquivo texto. vai para a próxima linha e repete o processo.o Sed é macho :) 3.

2. agora especificando um endereço para o comando p: prompt$ sed -n 5p texto. este comando imprime apenas a linha 5 do texto. prompt$ sed 'p' texto.txt 3. Os comandos do sed ===================== 4. lê o texto da entrada padrão.txt | sed 'p' prompt$ sed 'p' < texto.2. [TEXTO] contido no ESPAÇO PADRÃO imprime o número da linha atual do [ARQUIVO] inicia um comentário . Para mais informações.1.via duto |. pode ser uma palavra. E como dica geral SEMPRE coloque os comandos do Sed entre aspas simples ''. 3. aceitando como parâmetro um nome de arquivo. para evitar que o shell os interprete erroneamente. Como executá-lo ==================== A execução do Sed é igual a de outro aplicativo qualquer de manipulação de texto. ou na falta deste. várias separadas por \n. Outros exemplos ====================== Um outro exemplo do Sed com opções e recebendo um arquivo como parâmetro seria: prompt$ sed -n p texto. Descrição de todos os comandos =================================== prompt$ man sed prompt$ pinfo sed Ou num resumo rápido: Legenda: [ARQUIVO] [TEXTO] [PADRÃO] = # arquivo ou fluxo de texto (via pipe) original a ser modificado trecho de texto. as duplica.txt E ainda.txt Com outra opção ainda. 4. veja o tópico Tornando arquivos Sed executáveis. uma linha. Veja mais detalhes no tópico Sed e shell. ou mesmo um vazio. aplica o comando p para todas as linhas do arquivo.txt prompt$ cat texto.txt Ou seja.3. via duto | ou redirecionamento <. ou seja. pode-se executar diretamente um arquivo com comandos Sed.

se o último s/// funcionou (condicional) d D n N q apaga o [PADRÃO] apaga a primeira linha do [PADRÃO] vai para a próxima linha anexa a próxima linha no [PADRÃO] finaliza o Sed imediatamente o [TEXTO] contido no ESPAÇO RESERVA (sobrescrevendo) o [TEXTO] contido no ESPAÇO RESERVA (anexando) [PADRÃO] no ESPAÇO RESERVA (sobrescrevendo) [PADRÃO] no ESPAÇO RESERVA (anexando) conteúdos dos ESPAÇO PADRÃO e RESERVA 4. {} \(\) .. . Conceitos básicos ==================== Aqui vão conhecimentos que você precisa assimilar para fazer um bom uso do .! .2.. { } inverte a lógica do comando separador de comandos separador de faixas de endereço início 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 após a linha atual g G h H x restaura restaura guarda o guarda o troca os p P l imprime o [PADRÃO] imprime a primeira linha do [PADRÃO] imprime o [PADRÃO] mostrando caracteres brancos r w inclui conteúdo de um arquivo antes da linha atual grava o [PADRÃO] num arquivo : b t define uma marcação pula até uma marcação pula até uma marcação. -e \n b t d D n N q // . 5. Lista de todos os comandos por categoria ============================================= informações marcadores comentários comandos de edição comandos de registradores comandos de impressão comandos de arquivo modificadores separadores controle de fluxo endereço limitadores registradores dinâmicos = : # s i c a y g G h H x p P l r w g i ! .

1. que diz "imprima esta linha".1. modificadas ou não.txt Que resulta no conteúdo do arquivo. Este endereço pode ser descrito direto como o número da linha. Assim sendo. Caso o endereço não seja informado. a não ser quando especificado com o comando p ou o l". 5.1. que significa "não imprima na saída. Suprimindo a saída padrão ============================== 5. pois cada linha é impressa apenas uma vez. fazendo com que ela apareça duas vezes. Endereço simples ======================= .1. 5. Veja o primeiro exemplo citado: prompt$ sed 'p' texto. o comando Sed será aplicado para todas as linhas.2. colocando o -n. Assim fica fácil entender como funciona o exemplo já citado que imprime apenas a linha 5 de um arquivo: prompt$ sed -n 5p texto. ou por parte de seu conteúdo (entre /barras/). Saída suprimida ====================== Temos como modificar este comportamento com a opção -n.txt Ok. eliminamos o comportamento padrão de "imprimir sempre na saída": prompt$ sed -n 'p' texto.2.1. além da impressão normal de cada linha. a explicação daquele 5 ali perdido vem logo a seguir no tópico O endereço :) 5. ainda é aplicado o comando p em cada uma. devido ao comando p.Sed. Este exemplo duplica todas as linhas do arquivo pois. Saída normal =================== Normalmente o Sed sempre imprime na saída padrão todas as linhas do arquivo.txt O comando p imprime a linha na saída padrão. O endereço =============== O endereço serve para você dizer ao Sed para aplicar um determinado comando apenas nas linhas informadas.2. 5.

Isso é útil no nosso exemplo anterior de emular o comando head.3./estorvo/d' texto. como já foi visto anteriormente: prompt$ sed '5d' texto.10d' texto.txt No endereço. como da linha 5 até a linha 10. Interrompendo o processamento ================================== A qualquer hora você pode abortar o comando Sed com o comando q.txt 5. Assim sendo.txt Que referencia a linha que contém a palavra estorvo e mais as 3 linhas seguintes.txt (*) veja o tópico Nota sobre os adicionais GNU 5. ou da linha 5 até a linha que tiver a palavra estorvo: prompt$ sed '5. Intervalo ================ Como endereço. E pra finalizar.txt O comando d apaga linhas segundo o endereço. temos um caractere especial. . Outros ============= No Sed da GNU. a partir da versão 3.txt prompt$ sed '5. é aplicado para todas as linhas: prompt$ sed 'd' texto.txt Mas também poderia ser uma linha que tivesse uma palavra qualquer: prompt$ sed '/estorvo/d' texto.2. o $ que referencia à última linha do texto. Este exemplo tem o funcionamento idêntico ao comando: prompt$ grep -v estorvo texto. ainda se pode especificar um intervalo. foi adicionada uma maneira nova de especificar um endereço: prompt$ sed '/estorvo/.$d' texto. imprimindo apenas as 10 primeiras linhas do arquivo: sed '10q' ao chegar na linha 10. quando o comando não tem endereço. referenciando a linha pelo seu número.3.+3d' texto. pare.Por exemplo.2. então este comando apagará todas as linhas que tiverem a palavra estorvo. o comando é: prompt$ sed '10.02a(*).txt 5. para apagar da linha 10 até o final do texto.2. como já dito anteriormente.

4. Basta separá-los por ponto-e-vírgula. isso quer dizer implicitamente que este comando será aplicado em todas as outras linhas.10d. 10 e as que têm estorvo do arquivo texto. imprima as outras) A dica é sempre complementar a leitura mental com o inverso (entre parênteses nos exemplos). Comandos com parâmetros ============================== Os comandos que recebem parâmetros (r. se o Sed NÃO vai aplicar um comando em determinadas linhas. Com as dicas já vistas. Comandos normais ======================= É possível aplicar vários comandos Sed. É estranho. e tudo se esclarece :) Temos o comando head que imprime as 10 primeiras linhas de um arquivo. mas você tem que começar a pensar como o Sed.5. para obter apenas os cabeçalhos de uma mensagem de e-mail. 5.$!p' NÃO apague da linha 1 até a 10 (ou seja.Ou ainda.10!d' sed -n '11. ou seja. a. É meio estranho a primeira vista.2. c).1. i. Estes comandos devem ser separados dos restantes. Invertendo a lógica ======================== No Sed temos o modificador ! que inverte a lógica do comando. pela opção de linha de comando -e: prompt$ sed -e '1i começo de tudo' -e '5d' texto. podemos fazer esta tarefa com o Sed assim: sed -n '1./estorvo/d' texto. não aceitam o ponto-e-vírgula como separador.$d' imprima apenas da linha 1 até a 10 apague da linha 11 até o final Ou ainda. Aplicando vários comandos de uma vez ========================================= 5. prompt$ sed '5d.5.10p' sed '11. ou seja !comando significa "não execute o comando".txt Este comando apaga as linhas 5. mas acostuma :) 5.txt . que são separados do corpo da mensagem por uma linha em branco: sed '/^$/q' pare na primeira linha em branco que achar 5. w. sendo passados como comandos isolados. em seqüência. pois este pode ser parte integrante do parâmetro esperado. apague as outras) NÃO imprima da linha 11 até o final (ou seja.5. podemos inverter a lógica e fazer: sed '1.txt.

Conceitos complementares =========================== Estes são conhecimentos que possivelmente surgirão como dúvidas em sua cabeça após utilizar o Sed por um tempo. 5.txt. O interpretador de comandos (shell). então alguns caracteres especiais como $. deve-se ter alguns cuidados para evitar transtornos.2. como quando querendo substituir /usr/local/bin por /usr/bin.Este comando insere a frase começo de tudo antes da primeira linha e apaga a quinta linha do arquivo texto. No comando s =================== É comum ao fazer um comando de substituição s/// conter uma / num dos dois lados do comando.2. como uma variável por exemplo. \ e !. Sendo a barra o delimitador do comando s as outras barras comuns devem ser escapadas com a barra invertida \. são interpretados pelo shell antes de chegarem ao Sed. existir algo que deva ser interpretado. Veja o tópico Colocando comandos Sed num arquivo. interpreta a linha de comando antes de processá-la. Sed e shell ================ Com o Sed sendo invocado na linha de comando.1.3.txt Ou ainda.txt Salvo quando no meio do comando Sed. um por linha. Usando outros delimitadores ================================ 6. 6. sem se preocupar com aspas. modificando o comportamento esperado. 6. para não serem confundidas com os delimitadores normais. para evitar completamente a interpretação do shell. Neste caso coloque os comandos entre aspas duplas: prompt$ sed "s/$HOME/aquilo/" texto.5. Veja o tópico Colocando comandos Sed num arquivo.txt . ficando o monstro a seguir: prompt$ sed 's/\/usr\/local\/bin/\/usr\/bin/' texto. Para evitar isso coloque os comandos Sed sempre entre aspas simples: prompt$ sed 's/isso/aquilo/' texto. coloque os comandos Sed num arquivo. Terceira via =================== Outra maneira de especificar vários comandos (e a mais consistente e garantida) é colocá-los num arquivo. 6.1.

Então.txt ./usr/bin.2.80(*)./usr/local/bin. voltando com a festa dos escapes: prompt$ sed '/\/usr\/local\/bin/d' texto. No endereço ================== E se precisássemos apagar as linhas que contém o /usr/local/bin? Teríamos que colocar o nome do diretório no endereço do comando d. é o redirecionamento: prompt$ sed 'comando' texto.d' texto.02. vários 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 (avança linha) newline (quebra de linha) carriage-return (retorno de carro) hTAB (tabulação horizontal) vTAB (tabulação vertical) o caractere de valor octal NNN o caractere de valor decimal NNN o caractere de valor hexadecimal NN (*) veja o tópico Nota sobre os adicionais GNU 6. neste caso. basta lembrar que o comando s aceita qualquer delimitador.txt Evitando-se de ter que ficar escapando as barras. Gravando o resultado no mesmo arquivo ========================================== 6.txt Para usarmos outro delimitador no endereço. A mesma dica vale para o comando y.1.txt Confusão de delimitadores com o texto a ser procurado é muito comum de acontecer. então se algo não está funcionando como deveria.Para evitar ter que ficar se escapando todas estas barras.4. poderíamos escolher outro delimitador como por exemplo a vírgula: prompt$ sed 's.4. 6. 6. basta escaparmos o primeiro. sendo a barra apenas um padrão de referências históricas./usr/local/bin.' texto. olhe com cuidado para ver se não há conflitos entre eles.3. que no caso abaixo é a vírgula: prompt$ sed '\. a partir da versão 3. Escapes para caracteres especiais ====================================== No Sed da GNU. Problema inicial ======================= O procedimento comum quando se quer gravar num arquivo o resultado de um comando Sed.2.txt > texto-alterado.

herdado do arquivo novo. este perderá seus atributos e ficará com os padrões do sistema.txt Para a grande maioria dos casos.txt Mas é só fazer para ver. Isso acontece porque ao fazer o redirecionamento >.txt > texto. grupo diferente do padrão do usuário. e seu conteúdo perdido. E como este é um redirecionamento destrutivo > e não incremental >>.Mas é muito comum. ao alterarmos um arquivo.4. o resultado será o próprio arquivo vazio. ou referências (links.1. isso só é o mv pode ser usada. queremos gravar estas alterações no próprio arquivo original. A tentativa intuitiva seria: prompt$ sed 'comando' texto. Solução genérica ======================= Para evitar isso. principalmente saber aplicável a qualquer necessário com arquivos especiais.txt prompt$ sed 'comando' texto-tmp. 6. com os atributos padrão do sistema. voltamos a primeira tática de gravar o resultado num outro arquivo. e depois o mais natural é mover o arquivo novo sobre o original: prompt$ sed 'comando' texto.txt prompt$ mv texto-alterado. a abordagem mais ortodoxa e segura seria aplicar o comando Sed numa cópia e gravar o resultado no arquivo original via redirecionamento: prompt$ cp -a texto. tudo isso será perdido. o Sed começará seu processamento já lendo um arquivo texto. Solução segura ===================== Para evitar isso. antes mesmo de começar a executar o comando Sed. você ainda perderá todo o conteúdo do arquivo.txt > texto-alterado. Tarefas diversas =================== 7. 6. Como substituir alguma coisa por uma quebra de linha ========================================================= .txt vazio.txt texto. Ao mover o arquivo recém-criado.txt' possua atributos especiais. sendo este conhecimento outro comando do sistema que leia e grave arquivos. A essa altura. 7.3. Além de não dar certo. senão a solução com Mas é importante ter em mente esta outra maneira e o porque de utilizá-la. isso é suficiente.txt Novamente. sobre o original. mas convém aqui lembrar que caso o arquivo 'texto.txt prompt$ rm texto-tmp. e aplicados qualquer comandos Sed num arquivo vazio.2. o shell abre imediatamente o arquivo referenciado.4.txt > texto.txt texto-tmp. simbólicos ou não) para outros arquivos. ele será truncado. se o arquivo já existir.

Lendo e gravando em arquivos externos ========================================== 7. a quebra de linha deve ser inserida literalmente e deve ser escapada: prompt$ sed 's/ /\ prompt$ /g' texto. ROOT.02. fica trivial: prompt$ sed 's/ /\n/g' texto.01-beta1(*). foi adicionado o \n como escape válido dos dois lados do comando s///.txt (*) veja o tópico Nota sobre os adicionais GNU 7. Com isso a tarefa de colocar cada palavra numa linha isolada.ta' (*) veja o tópico Nota sobre os adicionais GNU 7. a partir da versão 3.s/\n/ /g.2. a operação inversa.txt Ou ainda: prompt$ sed 's/root/administrador/Ig' texto. é dizendo literalmente todas as possibilidades. Apagando linhas específicas ================================ O comando para apagar linhas é o d. Lendo arquivos .txt Como curiosidade.80(*). O único detalhe nesta tarefa é especificar quais linhas você vai querer apagar. foi adicionado o modificador I no endereço e no comando s///.txt Para apagar todas as linhas que contêm a palavra root. ou seja.4.txt Mas com outras versões do Sed que não entendem este escape.1. RooT etc.4. a partir da versão 3. como em: prompt$ sed '/[Rr][Oo][Oo][Tt]/d' texto. trocar espaços em branco por quebras de linha. No Sed da GNU.No Sed da GNU.$!N. já é mais trabalhosa e utiliza o conceito de laço: prompt$ sed ':a. de colocar todas as linhas de um arquivo numa linha só. fazendo com que o comando acima fique mais simples: prompt$ sed '/root/Id' texto.3. Como ignorar maiúsculas e minúsculas ========================================= O jeito padrão do Sed ser "ignore-case". Isso está completamente coberto no tópico O endereço. 7.

5. o conteúdo do espaço padrão.txt Gravar dados num arquivo também pode servir de espaço auxiliar caso o espaço reserva não seja suficiente.===================== Uma tarefa comum é incluir cabeçalho e rodapé num arquivo qualquer.4./<\/pre>/c \ prompt$ aqui tinha texto pré-formatado' texto.txt Para incluir o cabeçalho após a linha 1 e incluir o rodapé após a última linha.txt Nosso similar em Sed seria: prompt$ sed '/estorvo/w estorvos. 7. Por exemplo. Trocando um trecho de texto por outro ========================================== Uma tarefa que parece simples mas confunde.html Note que o comando c (assim como o a e o i) exige que o texto que ele recebe como parâmetro esteja na linha seguinte. A única complicação é definir o endereço.02a(*).2.txt > estorvos. para aplicar o comando apenas nas linhas desejadas. independente do número de linhas de ambos. é permitido que se coloque .5. ou melhor. você quer gravar num arquivo o resultado de uma busca por linhas que contêm a palavra estorvo.txt' texto. estando a quebra de linha escapada com a barra invertida \ No Sed da GNU. Gravando arquivos ======================== O comando w grava num arquivo a linha atual. é trocar um trecho de texto.txt' -e '$r rodape. basta usar o comando c. não tão flexível. vamos colocar uma frase no lugar de uma área de texto pré-formatado num documento HTML. (*) a explicação do porquê das opções -e está no tópico Aplicando vários comandos de uma vez. por outro trecho. então basta(*): prompt$ sed -e '1r cabecalho. A solução não-Sed seria: prompt$ grep 'estorvo' texto. O Sed possui um comando específico para ler arquivos. Por exemplo.1. Esta área é delimitada pelos identificadores <pre> e </pre>: prompt$ sed '/<pre>/. 7. o r. Trocar várias linhas por uma =================================== Essa é simples. que "Coloca" um texto no lugar da linha atual. como um parágrafo inteiro por exemplo. a partir da versão 3. Mas esta é uma opção drástica. 7.txt' texto. Mais informações sobre o espaço reserva no tópico Conhecendo os registradores internos.

txt./<\/pre>/d' texto. Supondo que nosso texto explicativo do porquê da retirada do texto pré-formatado foi gravado no arquivo desculpa. mas é muito mais prática caso a alteração do texto a ser colocado seja freqüente. pode-se usar o comando c e passar várias linhas para ele. Esta segunda solução é mais difícil de entender e implementar. o segundo comando apaga a linha </pre>. ele vai apagando. então vamos esquecer dele por para apagar o trecho desde <pre> até o trecho. além destas alterações poderem ser feitas por alguém que nem saiba o que é Sed.6. então assim que começar linha.\ mas eu resolvi tirar. completando a tarefa. a barra foi escapada. Mas melhor ainda é separar o comando Sed do texto.5. colocando-o num arquivo separado. quando o comando começa a ficar grande desse jeito.html (*) veja o tópico Nota sobre os adicionais GNU 7. basta editá-lo.html Então acompanhe o que acontece: linha </pre> que é o fechamento enquanto. utilizaremos o comando r para lê-lo e o comando d para apagar o texto antigo: prompt$ sed -e '/<\/pre>/r desculpa. o primeiro comando será executado apenas na do trecho.. Saiba mais detalhes sobre isso no tópico Colocando comandos sed num arquivo. pois será apenas um texto normal. é melhor colocá-lo num arquivo.: talvez o <pre></pre> não seja um exemplo dos mais didáticos. O segundo comando diz </pre>. quando se precisar alterar este texto. Em seguida. colocando seu conteúdo imediatamente após a linha atual.txt.2. e sem precisar ficar colocando \ no final de cada linha. 7. linha por Ao chegar na linha que contém o </pre>..\ porque?\ porque sim' texto.txt' -e '/<pre>/. Assim. A explicação desse escape está em Usando outros delimitadores obs./<\/pre>/c aqui tinha texto pré-formatado' texto. ficando <\/pre>. Trocar várias linhas por outras ====================================== Similarmente a trocar por apenas uma linha. mas não me veio algo mais comum à mente. O único detalhe é que todas as linhas devem ser escapadas no final. Note que sempre que o </pre> foi referenciado nos endereços.o texto na mesma linha: prompt$ sed '/<pre>/. Emulando outros comandos .html É claro. menos a última: prompt$ prompt$ prompt$ prompt$ prompt$ sed '/<pre>/. o primeiro comando Sed entra em ação e lê o arquivo desculpa. sem mudar o comando Sed./<\/pre>/c \ aqui tinha texto pré-formatado.

net/local/docs/emulating_unix.2. a partir da versão 3. tornando possível editar um fluxo interminável como o gerado por um tail -f. com estruturação e comentários.uvwxyz/ -n $= sed sed sed sed sed sed sed sed A lista completa e atualizada pode ser encontrada em: http://sed. Monitorando um arquivo =========================== No Sed da GNU..sed: apaga algumas linhas # apaga a 5ª linha 5d # apaga a 10ª linha .sourceforge.UVWXYZ/abcdef. O exemplo de apagar linhas ficaria: # programa. Um exemplo prático seria mostrar apenas as mensagens do sistema relativas às conexões ssh: prompt$ tail -f /var/log/messages | sed -nu '/sshd/p' Cuidado com -nu perto de crianças! :) (*) veja o tópico Nota sobre os adicionais GNU 8. mostrando a saída o mais rápido possível.80(*).. faz um uso minimalista dos registradores. é conveniente colocá-los num arquivo. por quebras de linha e colocar comentários precedidos de #. fazendo programas grandes e/ou complexos.h. Colocando comandos Sed num arquivo ======================================= Como os comandos Sed vão ficando extensos e complicados.txt 8..02. foi adicionada a opção -u. que significa "unbuffered". ou seja.============================= Aqui vão alguns exemplos de emulações de outros comandos usando-se o Sed: || comando | cat | head | grep | grep -v | tac | tail -1 | tr A-Z a-z | wc -l | | | | | | | | | emulação : 10q /padrão/!d /padrão/d 1!G.. Conceitos avançados ====================== Estes são conhecimentos necessários àqueles que fazem uso intensivo do Sed.1. trocando o . Você pode espalhar os comandos por várias linhas. 8.$!d $!d y/ABCDEF.

inicialmente vazio. O mesmo funciona para qualquer outro interpretador.10d # apaga as linhas que contêm 'estorvo' /estorvo/d Para dizer ao Sed para utilizar aquele arquivo como fonte de comandos. então para tornar um arquivos de comandos Sed executável basta colocar como primeira linha: #!/bin/sed -f E é claro. Tornando arquivos Sed executáveis ====================================== O interpretador de comandos mais utilizado (bash) sempre procura na primeira linha de um arquivo instruções para executá-lo. que é um registrador auxiliar.txt | . torná-lo executável: prompt$ chmod +x programa.1. Apresentação =================== O Sed possui 2 registradores ("buffers") internos.sed 8. Se um arquivo é um programinha em shell./programa. que são usados para a manipulação do texto. chame-o normalmente: prompt$ . ou agrupar dados diversos de várias linhas. como o Sed. basta colocar #!/bin/sh Na primeira linha para que o bash saiba que deve executá-lo com o comando /bin/sh.4. Um deles é o espaço padrão ("pattern space").txt prompt$ cat texto. que serve para guardar uma cópia da linha original. O outro é o espaço reserva ("hold space").sed E na linha de comando. parte dela.txt 8.sed texto. que é o registrador utilizado normalmente pelo Sed. É nele que a linha a ser processada é armazenada e manipulada./programa.3.sed texto. Conhecendo os registradores internos ========================================= 8.4. basta usar a opção -f prompt$ sed -f programa. Há comandos para fazer a troca de dados entre os dois registradores: h H guarda no espaço reserva guarda (anexando) no espaço reserva .

/melancia/G . 8. merecem uma explicação bem didática. Temos os dois registradores vazios: (que daqui pra frente serão chamados apenas de padrão e reserva) __________________ | | | | |__________________| espaço padrão __________________ | | | | |__________________| espaço reserva E um arquivo hipotético com o conteúdo: (não são odiosos estes exemplos com frutas?) laranja uva abacaxi melancia mimosa E aplicaremos o comando: sed '/laranja/h . 8.$g' /etc/passwd Ou seja. ele mantém o que já tem. e adiciona um \n (quebra de linha). veja o exemplo gráfico a seguir.3. /uva/g . seguido do texto manipulado. /abacaxi/H . Exemplo gráfico ====================== Como os registradores são a parte mais obscura do Sed (mais por falta de documentação do que por complexidade). Vamos lá. adicione no espaço reserva (comando H). Exemplo ============== Um exemplo didático de uso do espaço reserva é ir guardando nele algumas linhas do texto e mostrá-las depois no final do arquivo: prompt$ sed '/root/H. recupere o conteúdo do espaço reserva (comando g).g G pega o conteúdo do espaço reserva pega (anexando) o conteúdo do espaço reserva x troca os conteúdos dos 2 registradores O anexando acima significa "não sobrescreve o conteúdo original". /mimosa/x' Obtendo como resultado: laranja laranja abacaxi melancia . as linhas que contêm a palavra root e na última linha do arquivo (endereço $). ou seja.4. Para entender melhor.4.2.

novamente a primeira coisa é colocá-la no padrão. Beleza. Lida a primeira linha laranja. ela é imediatamente colocada no padrão para ser manipulada: __________________ | | | laranja | |__________________| espaço padrão __________________ | | | | |__________________| espaço reserva O comando direcionado a ela é o h. apagando o que estiver nele (neste caso: uva): __________________ | | | laranja | |__________________| espaço padrão <-. permanecerá o mesmo. que guarda uma cópia dela no reserva: __________________ | | | laranja | |__________________| espaço padrão -. não há mais comandos a ser executados.laranja abacaxi laranja abacaxi Vejamos o que aconteceu. O comando direcionado à linha uva é o g. então imprime na saída o conteúdo do padrão: "laranja".g -- __________________ | | | laranja | |__________________| espaço reserva Novamente. sobrescrevendo o que tinha antes: __________________ | | | uva | |__________________| espaço padrão __________________ | | | laranja | |__________________| espaço reserva O reserva. o Sed dá por encerrado o processamento dessa linha e imprime o conteúdo do padrão na saída: "laranja". Indo para a terceira linha e colocando-a no padrão: __________________ | | | abacaxi | |__________________| espaço padrão __________________ | | | laranja | |__________________| espaço reserva O comando dessa linha é o H. agora ele vai processar a segunda linha. que pega o conteúdo do reserva e o coloca no padrão.h --> __________________ | | | laranja | |__________________| espaço reserva Como mais nenhum comando é relativo à linha laranja. que tal como o h. guarda o conteúdo do padrão no reserva. enquanto nenhum outro comando escrever nele. com diferença que ele preserva o conteúdo já .

que pega o conteúdo do reserva e anexa ao padrão: ____________________________ __________________ | | | | | melancia\nlaranja\nabacaxi | <-G-. o comando que troca o conteúdo dos 2 registradores. com o detalhe que o Sed troca estes \n por quebras de linha na impressão. aplicando o comando G.4. separando com um \n: __________________ | | | abacaxi | |__________________| espaço padrão -. fica lá até ser sobrescrito O \n é o separador do conteúdo original com o anexo Na saída. E finalmente. a próxima linha é a da melancia: __________________ | | | melancia | |__________________| espaço padrão __________________ | | | laranja\nabacaxi | |__________________| espaço reserva E agora vai ficar divertido. chegou ao fim. a última linha: __________________ | | | mimosa | |__________________| espaço padrão __________________ | | | laranja\nabacaxi | |__________________| espaço reserva E para ela. o x: __________________ __________________ | | | | | laranja\nabacaxi | <-. com duas linhas: "laranja" e "abacaxi". Vá acompanhando com o resultado que já foi cantado antecipadamente lá em cima.) 8.existente dele.| laranja\nabacaxi | |____________________________| |__________________| espaço padrão espaço reserva E a saída agora fica "melancia\nlaranja\nabacaxi". imprime o padrão: "abacaxi". Ufa! Depois dessa não venha me dizer que não sabe como funcionam os registradores internos do Sed . Então são 3 linhas na saída. o \n vira quebra de linha .4. Resumão ============== - Cada linha nova lida é colocada (sobrescrevendo) no espaço padrão Uma vez colocado algo no espaço reserva.x ---> | mimosa | |__________________| |__________________| espaço padrão espaço reserva E mostra na saída o padrão.H --> __________________ | | | laranja\nabacaxi | |__________________| espaço reserva Novamente.

9.4.2..3.1. Fluxogramas ============== 9. Fluxos dos registradores internos ====================================== . Fluxograma ================= Para uma representação gráfica dos fluxos e comandos que manipulam estes registradores.) 8.5. Fluxos da execução dos comandos ==================================== _________ | | ______| próxima |<---+ / | linha | | | |_________| | | | v d D | n N _____|______ | | COMEÇO --------->| COMANDOS |----------> FIM DO PROGRAMA |____________| q | ^ b | t | | | | ___|______ | | | +-->| marcação | |__________| 9. Fluxos do texto ==================== _________ w | | r +------->| ARQUIVO |-------> | |_________| ______|______ SAÍDA n | | p P l ENTRADA ------->| S E D |-------------------> N |_____________| a i c | | d +-------> /dev/null D 9. veja o tópico Fluxos dos registradores internos.Registradores são simples! .

Mas o preço de se usar essas funcionalidades é que se perde em compatibilidade. Onde obter mais informações =============================== Informações em português: .com.g G ----|__________________| Veja explicação sobre estes registradores no tópico Conhecendo os registradores internos.x --->| ESPAÇO RESERVA | |_________________|<--.gnu.net/sed Informações em inglês: - http://sed.html http://www. mas o recado fica dado.html http://www.ftp://alpha._________________ __________________ | |---.sourceforge.txt http://sed.tw/~changyj/sed Última versão em desenvolvimento do Sed: . Nota sobre os adicionais GNU ================================ O Sed da GNU. 10.sourceforge.org/gnu/sed .dreamwvr.http://aurelio. 11.net/sedfaq.com/sed-info/sed-faq. Para a grande maioria dos usuários isso não fará diferença pois geralmente trabalham com apenas um tipo de sistema operacional. atualmente é o utilizado pela maioria das distribuições de Linux e é o que tem mais funcionalidades novas.net/sed1line.rtfiber.h H --->| | | ESPAÇO PADRÃO |<--. pois seu programa Sed não funcionará em UNIXes ou outros sistemas que usem um Sed que não o da GNU.