Escolar Documentos
Profissional Documentos
Cultura Documentos
DominandoSed PDF
DominandoSed PDF
uma obra
inacabada, que contm cerca de 60% do contedo planejado. Aps este perodo a
escrita parou e eu no tive mais vontade de continuar. A idia era fazer um guia
completo sobre o sed, uma bblia que abrangesse todos os tpicos, dando dicas
avanadas.
Hoje (Novembro de 2005) estou publicando o livro na Internet, com o texto intocado,
como parou em 2002. Considero este um trabalho que no deve ficar restrito ao meu
computador pessoal, pois mesmo incompleto pode ajudar outras pessoas a
dominarem o assunto.
Se voc novato em sed, leia o sed-HOWTO (http://aurelio.net/sed/sed-HOWTO)
primeiro. Terminada a leitura deste livro, domine tambm as Expresses Regulares
(http://aurelio.net/er) para obter o mximo do sed.
DIREITOS AUTORAIS (COPYRIGHT): Este contedo livre, voc pode reproduzi-lo
em qualquer meio, mas sempre deve citar a autoria (Aurlio Marinho Jargas) e o
endereo oficial http://aurelio.net/sed/livro.
Boa leitura!
ndice
Instalao..................................................................................................................7
Endereo...................................................................................................................9
Um endereo sempre aponta para uma linha inteira..........................................................11
Como enderear pelo nmero da linha................................................ ..............................12
Como enderear a primeira e/ou a ltima linha.................................................................13
Como enderear a linha que contm determinada palavra.................................................14
Como aplicar vrios comandos em um mesmo endereo...................................................17
Como enderear um trecho entre duas linhas, incluindo-as..............................................19
Como enderear um trecho entre duas linhas, excluindo-as..............................................21
Como negar um endereo, no aplicando comandos nele..................................................24
Como enderear a primeira ocorrncia de um padro........................................................26
Como enderear a primeira ocorrncia de um trecho.........................................................29
Como enderear a ltima ocorrncia de um padro...........................................................30
Como enderear a N-sima ocorrncia de um padro.......................................................34
Tem uma barra / no padro que procuro, e agora?............................................................35
Como usar outro delimitador fora a barra /......................................................................37
O que acontece com endereos invlidos..........................................................................40
E se eu colocar um endereo vazio como //?.....................................................................42
E se eu no colocar nenhum endereo?.............................................................................44
Detalhes srdidos sobre endereos.................................................. .................................45
Arquivo....................................................................................................................47
Como gravar o resultado num arquivo..............................................................................48
Como gravar o resultado no prprio arquivo original........................................................51
Como guardar os comandos sed num arquivo (script).......................................................56
Como utilizar um script sed........................................................ ......................................60
Como tornar executvel um script sed..............................................................................63
Como monitorar um arquivo com a ajuda do sed..............................................................66
Como ler o contedo de um arquivo.................................................................................68
Como gravar um trecho de texto num arquivo..................................................................74
Quebra de linha.......................................................................................................78
Como apagar uma quebra de linha, juntando duas linhas..................................................80
Como apagar todas as quebras de linha, deixando tudo numa s linha.............................82
Como fazer um lao.........................................................................................................84
Como fazer um lao com condicional de sada..................................................................85
Como fazer um lao com condicional de entrada..............................................................87
Como fazer um lao utilizando o reserva..........................................................................89
Como substituir alguma coisa por uma quebra de linha....................................................92
MAISCULAS/minsculas.........................................................................................93
Como deixar todo o texto em caixa alta (ou baixa)............................................................94
Como inverter a caixa de todas as letras...........................................................................98
Como levantar a caixa da primeira letra de cada linha.......................................................99
Como levantar a caixa da primeira letra de cada palavra..................................................103
Como ignorar a diferena de maisculas e minsculas....................................................106
Cumbuca...............................................................................................................109
Exemplos teis....................................................................... ........................................110
Emulando comandos UNIX/Linux....................................................................................111
Agradecimentos.....................................................................................................113
Instalao
Antes de mais nada, o site http://sed.sf.net a fonte de informao mais atualizada sobre
onde encontrar o sed para as vrias plataformas suportadas. Consulte-o!
UNIX/Linux/Mac OS X
Espera a, voc vai me dizer que tem um UNIX/Linux e no tem sed instalado nele? Conta
outra! &:D
Para atualizar uma verso existente, o procedimento o mesmo do de outros programas, e
isso pode requerer a instalao de um RPM, um pacote .deb ou baixar um .tar.gz e compillo.
Windows/DOS
Usurios de Windows tm duas opes para usar o sed:
SED.EXE no DOS
sed no Cygwin
7
O sed nasceu no UNIX, mas vrias verses do programa foram feitas para MS-DOS devido
falta de uma ferramenta semelhante nesse sistema. O nome genrico SED.EXE, mas tambm
pode ser encontrado como SED.ZIP, caso acompanhe documentao.
A instalao no tem segredo. Basta copiar o arquivo SED.EXE para um diretrio que esteja no
PATH do seu MS-DOS. Lugares comuns so C:\Windows, C:\WIN ou C:\WINNT.
Para quem gosta de UNIX/Linux, aconselhvel instalar o Cygwin (http://aurelio.net/cygwin),
uma soluo completa com ferramentas UNIX que roda no Windows. Com um clique, voc tem
acesso a uma janelinha preta com sed, bash, cat, tr, grep, find, vi e dezenas de outros
programas. Vale conferir!
Endereo
Prepare-se. Respire fundo. Abra sua mente para receber conceitos novos, empolgantes e
poderosos!
Para comear, deixemos claro que endereo no um comando, mas sim o seu contexto. o
elemento que diz exatamente em quais linhas um comando, ou bloco deles, dever ser
aplicado.
O QUE FAZER ---> comando
ONDE FAZER
---> endereo
O endereo algo simples se seus problemas forem simples. Mas quando se quer resolver
algo realmente cabeludo com sed, o endereo tambm pode se tornar um monstro, daqueles
que, de to feios, quem olha pensa: "Tomara que eu nunca precise fazer manuteno nisso".
Para facilitar, podemos fazer uma analogia com os endereos de nossas casas, compostos
por: nome da rua, nmero, cidade e CEP. O comando sed seria o carteiro que, baseado no
endereo escrito na carta, deve encontrar o local correto.
Sabemos que quanto mais detalharmos o endereo, colocando todos os dados corretamente,
mais fcil para o carteiro encontrar o destino de nossa carta. Porm, na falta do CEP ou do
nmero da casa, a carta no chegar ao seu destino por causa do endereo incorreto.
No sed assim que acontece. Um endereo correto indispensvel para que o comando seja
aplicado no lugar certo. Assim, torna-se essencial para o programador, ao escrever um
comando sed, especificar o endereo com exatido e sem ambigidades.
O domnio do endereo diferencia os gurus dos gafanhotos
10
11
Fcil, no? Observe que o espao em branco entre o endereo e o comando opcional, ento
tambm poderia ser 5d. Mas para facilitar a visualizao de quem quem, vamos separ-los
sempre.
E assim se enderea, numericamente, qualquer comando linha desejada, desde que se saiba
qual sua posio no arquivo.
12
Moleza. Mas e a ltima? Nem sempre sabemos exatamente quantas linhas tem o arquivo, e
incmodo ter que usar outro programa para fazer isso antes de passarmos esse nmero ao
sed.
Para resolver esse problema, temos um caractere especial de endereo: o cifro $, que
representa a posio da ltima linha do arquivo. Ento fcil apagar a ltima linha:
prompt$ sed '$ d' arquivo
Note que em sistemas UNIX o uso das aspas simples obrigatrio. Sem elas o shell tentaria
expandir a varivel $d e o sed receberia um comando vazio.
13
Mas, como hoje no um dia bom para comer couve, vamos apag-la da lista:
prompt$ sed '/couve/ d' verduras.txt
- alface
- cenoura
- nabo
- vagem
Note que, para especificar uma palavra como endereo, devemos coloc-la entre /barras/.
Dentro dessas barras, pode-se colocar qualquer padro que se queira casar para se encontrar
uma linha. Pode ser uma ou mais palavras, smbolos ou expresses regulares.
A melhor maneira de se ler um endereo composto por um padro : "Nas linhas que
contenham a palavra XXXX, aplique o comando YYYY".
Note bem: "naS linhaS".
15
Um endereo pode servir para mais de uma linha, ento o comando ser aplicado em todas as
linhas que forem encontradas. Dessa forma, para apagar da nossa lista de verduras todas as
linhas que tenham a letra "o", fazemos:
prompt$ sed '/o/ d' verduras.txt
- alface
- vagem
16
Ficar repetindo o endereo para cada comando muito inconveniente. Utilizamos ento as
chaves {}, que nos permitem agrupar vrios comandos em um mesmo bloco. Este bloco
recebe um endereo, que ser usado por todos os comandos contidos nele.
17
Sei que voc leu e entendeu, mas tenha absoluta certeza de que voc vai se esquecer desse
ltimo ";" vrias, diversas, milhares de vezes. &:)
18
Ou seja, da linha 5 at a linha 10, apague tudo. Lembre-se porm, que um endereo tambm
pode ser o cifro $ ou um padro. Ento agora podemos misturar todos os tipos de endereo.
Veja os exemplos:
19
da
da
da
da
da
Como pudemos notar, o trecho casado inclui as linhas de incio e fim do endereo. Se no era
este seu objetivo, veja o tpico seguinte.
20
Supondo que se queira destacar tudo entre as linhas que contiverem um e cinco, incluindo as
prprias linhas delimitadoras, temos:
21
Mais detalhadamente:
/um/,/cinco/ {
/um/ b
/cinco/ b
s/^/---/
;#
;#
;#
;#
;#
;#
22
Ento, o comando b sozinho funciona como um pulo, uma exceo que no deixa o
processamento chegar at o s/^/---/ nas linhas especificadas.
23
24
Com blocos, a leitura fica: "Aplique os comandos do bloco em TODAS as linhas EXCETO as do
endereo".
Assim sendo, fica fcil mostrar apenas um trecho de texto e apagar todo o resto:
prompt$ sed '/dois/,/cinco/! d' numeros.txt
dois
trs
quatro
cinco
Em outro exemplo, vamos emular o comando head do UNIX, que imprime as 10 primeiras
linhas de um arquivo. Uma das possibilidades seria esta:
sed '11,$ d'
25
Vamos ler este comando: "Dentro da rea que vai da primeira linha at a linha que conter a
letra 'o', faa: se for uma linha com 'o', adicione '---' no comeo".
H tambm uma ttica mais simples, que funciona em casos especficos. Para tarefas como
extrao de dados, onde se busca apenas a primeira ocorrncia e nada mais, o comando de
interrupo de processamento pode ser utilizado.
A idia simples: colocar num bloco o comando desejado e a interrupo. Como a interrupo
s pode ser executada uma vez, est feito nosso "condicional" para obter apenas o primeiro.
Exemplo: extrair do arquivo apenas a primeira linha com a letra "o":
prompt$ sed -n '/o/{ p; q; }' numeros.txt
dois
Com a opo -n, silenciamos a sada do sed. Na linha com "o", executado um Print para
mostr-la e um Quit para sair.
27
A mesma ttica utilizada para extrair os cabealhos de um e-mail, que ficam sempre no
incio, separados do corpo da mensagem por uma linha em branco:
sed '/^$/q' email.txt
28
Traduzindo: "Do comeo do texto at a primeira linha que contiver ')', apague tudo que estiver
entre os parnteses, inclusive eles prprios".
29
A tentativa bvia falha porque o sed l as linhas de cima para baixo, ento o endereo
especificado acaba significando: "Procure da primeira linha que tiver a letra 'o' at a ltima
linha do texto".
Para fazermos um s/primeira/ltima/ com este significado, temos algumas alternativas. A mais
fcil, porm exclusiva de quem possui o comando tac, que imprime um arquivo da ltima para
a primeira linha, pode ser:
prompt$ tac numeros.txt
seis
cinco
quatro
trs
dois
um
30
Ento, invertendo a ordem das linhas, aplicamos o mesmo conceito de ancorar pela primeira
linha do arquivo (que na verdade a ltima), e ento basta desinverter o arquivo aplicando tac
novamente.
Quem no possui o tac, pode emul-lo com o sed:
prompt$ sed '1! G ; h ; $! d' numeros.txt
seis
cinco
quatro
trs
dois
um
31
Feio, muito feio. E esse mtodo de inverso complica tudo, pois o script a ser aplicado ao
trecho, caso seja necessrio mexer com mais de uma linha, tambm precisa trat-las de
maneira invertida. Em algumas situaes onde se tem uma seqncia certa de linhas, inverter
a lgica pode ser impraticvel.
Mas, com exceo dessa ttica, no h muitas alternativas. Dependendo do que precisamos
fazer com o padro, podemos usar outras abordagens.
Por exemplo, se precisarmos simplesmente imprimir na tela a linha da ltima ocorrncia,
podemos usar o sed duas vezes:
prompt$ sed '/o/! d' numeros.txt | sed '$! d'
cinco
O primeiro obtm todas as linhas que contm o padro, e o segundo mostra apenas a ltima
linha, apagando todas as outras. Um comando UNIX similar seria:
prompt$ grep 'o' numeros.txt | tail -1
Para fazer isso usando apenas um sed, podemos utilizar o RESERVA para ir armazenando
(sobrescrevendo) todas as linhas que contm o padro, e quando chegarmos na ltima linha
do arquivo, mostramos o contedo do RESERVA:
32
33
Sim, possvel, dependendo do caso. Mas contando que o grau de dificuldade enorme para
se fazer isso num problema mais elaborado, alm do cdigo resultante ficar grande e difcil de
se manter, o aconselhvel usar outra linguagem, como awk, que tem o conceito de linhas e
registros, incluindo contadores, ou usar o sed em conjunto com um script shell.
Como nem um (shell) nem outro (awk) faz parte do nosso tpico, fim de papo.
34
O que aconteceu em todos os exemplos que o sed confundiu a barra normal dos padres
com a barra delimitadora do endereo. O que temos que fazer aqui para que essas barras
normais no sejam interpretadas como delimitadoras, escap-las.
35
36
Ento utilizamos a vrgula como delimitador de endereo, escapando a primeira para que o
sed a veja como especial.
37
Fora a vrgula, outros delimitadores reserva que so clssicos de usar a barra vertical |, o
arroba @ e a exclamao !. Agora, para evitar dor de cabea e usar um delimitador que
dificilmente coincidir com qualquer padro, use caracteres esquisitos como: , e .
Ou ainda, se voc quiser fazer algo realmente esquisito, use caracteres brancos como o
espao ou o TAB, ou letras normais do alfabeto, nmeros (cuidado!)
sed '\ 31/12/2000 d' arquivo
sed '\i31/12/2000i d' arquivo
sed '\831/12/20008 d' arquivo
38
Uma regra boa para a escolha do delimitador, alm dele no coincidir com algum caractere do
padro, que ele seja visualmente oposto ao padro. Isso quer dizer que se o seu padro
tiver uma predominncia de caracteres altos, como uma palavra em MAISCULAS,
aconselhvel usar caracteres baixos como delimitadores, como a vrgula, dois pontos e o
sublinhado. E se o padro for predominantemente baixo, caracteres como / ! | % e @ so mais
indicados. Veja:
visual
confuso
s_$PWD_/TMP_ s!$PWD!/TMP!
s|...=|=|
s:...=:=:
39
40
No primeiro exemplo, era para apagar da linha que tivesse prego at o final. Como nenhuma
linha tinha prego, o primeiro endereo falhou e nada foi apagado.
J no segundo exemplo era para apagar da primeira linha at a linha que tivesse prego. A
primeira linha foi encontrada, ento o comando d vai ser aplicado at achar o segundo
endereo. Mas como no tem prego no arquivo, o comando vai sendo aplicado at bater na
ltima linha. como dizer: "Ningum me mandou parar, ento continuei".
1 endereo invlido: endereo invlido, nada acontece
2 endereo invlido: endereo incompleto, vai at o final
41
E aquele outro de ancoragem para imprimir apenas a primeira linha que contivesse a letra o?
prompt$ sed '1,/o/{ /o/ d ; }' numeros.txt
42
A diferena parece pequena porque os exemplos usam endereos bem simples, mas quando
eles so monstros gigantes que cospem expresses regulares, o endereo vazio ajuda muito.
E tem ainda o clssico //s/// que um comando vlido e bem utilizado. Voc se arrisca a
adivinhar o que ele faz?
43
44
As linhas de incio e fim de um trecho no podem ser a mesma linha, ento mesmo que
seu endereo tenha padres idnticos como /cebola/, /cebola/, sero necessrias duas
linhas diferentes que contenham a palavra cebola para que este endereo seja
encontrado. Ento um trecho sempre tem no mnimo, duas linhas.
45
46
Arquivo
J vimos que o sed no um editor de arquivos, mas de fluxos de texto. Como tal, a sua
funo aplicar os comandos de edio no texto e mostrar o resultado na tela.
Mas mesmo tendo seu funcionamento independente do conceito de arquivos, o sed precisa
lidar com eles, pois ns humanos gostamos de arquivos!
Temos nossos dados guardados em arquivos, ento o sed precisa ter a capacidade de ler e
gravar linhas em arquivos. Podemos ainda querer guardar todo o resultado da edio feita
pelo sed em um arquivo. Ou ainda, podemos querer colocar nossos comandos sed num
arquivo, pois eles esto ficando muito complicados. Feito isso, podemos at torn-lo um
arquivo executvel, que chama o sed automaticamente para interpret-lo!
Ufa! Para um programa que edita somente fluxos de texto, at que temos vrios detalhes para
ver no assunto "Arquivo", no? &:)
47
48
Memorizar fcil!
49
Usando...
>
>>
...acontece
o arquivo sempre zerado
o arquivo vai crescendo, crescendo...
A maioria dos ambientes shell conhecidos utiliza a notao do > e >> para redirecionamentos,
aqui vo alguns deles:
50
Pois amigo, brincadeiras parte, fazer cacas irreversveis em informtica to fcil que uma
simples apertada na tecla Enter na hora errada pode destruir um dia de trabalho (ou vrios...).
Essa introduo descontrada serve para aliviar o peso da culpa daqueles que j descobriram
pelo jeito difcil que gravar o resultado no mesmo arquivo pode ser cruel &:)
51
Problema inicial
Como j visto, utiliza-se o redirecionamento do shell para gravar o resultado do sed num
outro arquivo. Mas muito comum ao se editar um determinado arquivo, querer gravar estas
alteraes no prprio arquivo original. Faz sentido no faz? Ento a tentativa bvia e intuitiva
o clssico tiro no p:
prompt$ sed 'comandos' texto.txt > texto.txt
Alm de no dar certo, todo o contedo original do arquivo ser perdido. Que dureza hein?
Mas se errando que se aprende, caso voc nunca tenha feito essa caquinha (ainda), agora
sua chance de aprender sem precisar sofrer.
O que ocorre que ao fazer o redirecionamento destrutivo >, a primeira coisa que o shell faz
truncar o arquivo referenciado, antes mesmo de comear a executar o sed. Ento o contedo
do arquivo ser apagado antes do sed poder l-lo.
Quando finalmente o sed for chamado pelo shell, receber um arquivo vazio, e a no d para
fazer mgica: aplicados quaisquer comandos num arquivo vazio, o resultado ser sempre um
arquivo vazio. E fim de papo.
52
Soluo genrica
Para solucionar este dilema, voltamos a ttica j conhecida de redirecionar o resultado para
um outro arquivo, e depois mover o arquivo novo sobre o original:
prompt$ sed 'comandos' texto.txt > texto-alterado.txt
prompt$ mv texto-alterado.txt texto.txt
Para a grande maioria dos casos, isso suficiente. Porm caso as caractersticas do arquivo
original devam ser mantidas, temos um problema.
Como acabamos de criar um arquivo novo para guardar o texto alterado, ele ter os atributos
padro do sistema. Ao mov-lo sobre o arquivo original, estes atributos padro sero
herdados.
Atributos especiais que o arquivo original pudesse ter como: grupo diferente do padro do
usurio, permisses especficas (rwx) ou referncias para outros arquivos (links, simblicos ou
no) sero perdidos.
Soluo segura
Para uma soluo prova de falhas, usa-se uma abordagem mais conservadora e segura:
copiar o arquivo e redirecionar a sada para o original.
53
Dessa maneira no estamos criando um arquivo texto.txt novo, mas apenas trocando o seu
contedo, permanecendo inalteradas as suas caractersticas no sistema. Para finalizar a
operao, basta apagar o arquivo temporrio.
prompt$ rm texto-tmp.txt
Soluo moderna
Para evitar todas essas preocupaes e no ter que criar um arquivo temporrio, algumas
verses do sed (FreeBSD, ssed, gsed-4) possuem a opo "-i", que aplica os comandos "inplace", ou seja, no mesmo arquivo.
54
55
56
Mas no mesmo ponto que temos a primeira desvantagem: perdemos o contato com o shell,
nosso aliado poderoso. Com suas variveis, operaes e comandos, o shell complementa
onde o sed limitado. Quando colocamos os comandos sed num arquivo, eles tornam-se
estticos, e a interatividade direta com o shell perdida.
Uma outra vantagem da utilizao do arquivo, que podemos separar melhor os comandos,
colocando um em cada linha. Podemos fazer inclusive o alinhamento estruturado
("indentation") para que os blocos de comandos fiquem mais visuais.
E mais, agora podemos colocar tambm comentrios! Desprezado por muitos, eles so uma
das partes mais importantes de um programa. S quem j precisou dar manuteno num
cdigo complexo e sem comentrios (ou mal comentado) sabe a falta que eles fazem...
E por favor, pelo seu prprio bem e dos que um dia precisarem dar manuteno num script
sed de sua autoria, encha-o de comentrios! O sed especialmente abstrato e desafiador,
com seus comandos de apenas uma letra, sem variveis e muitas expresses regulares. A falta
de comentrios pode deixar um script inutilizvel se ningum souber como atualiz-lo. O
caractere que precede os comentrios num script sed aquele que cada um chama de um
jeito: #. Gradinha, cerquilha, sustenido, jogo da velha, hash, ...
Script sed: shell--, alinhamento++, comentrios++, legibilidade++
57
um endereo com um bloco de comandos dentro das chaves {}. No bloco esto trs
comandos, separados por ponto-e-vrgula. H uma certa dificuldade em identificar e entender
as partes desse comando, por estar tudo misturado numa nica linha. Vamos coloc-lo num
arquivo e ver se melhora?
### meu primeiro script sed
# ei, isso um comentrio!
# vamos delimitar um bloco de linhas
# endereo: entre a linha que contm 'um' e a linha que contm 'cinco'
/um/ , /cinco/ {
### nesse ponto do script, s chegaro as linhas que estiverem entre
### 'um' e 'cinco', incluindo elas prprias.
# se for a linha que contm 'um', v at o final do script
/um/ b
# se for a linha que contm 'cinco', v at o final do script
/cinco/ b
### nesse ponto do script, as linhas 'um' e 'cinco' j no chegam mais.
### ento somente para as outras ser aplicado o prximo comando.
# coloque um '---' no comeo da linha
58
Tudo bem, os comentrios esto exageradamente explicativos, mas a idia mostrar o quo
didtico pode ficar seu script sed. Com certeza ficou 78% mais fcil de ler! (No so irritantes
essas estatsticas subjetivas e absurdas que ouvimos diariamente?)
notvel a diferena do entendimento entre este script e a linha de comando anterior onde os
comandos estavam todos grudados. Moral da histria: fica a critrio do programador fazer um
cdigo pequeno e indecifrvel, ou extenso e legvel. Ambas as formas tm suas audincias.
Como os espaos em branco no comeo de cada linha so irrelevantes para o sed, temos a
liberdade de estruturar as linhas como preferirmos, podendo utilizar espaos e TABs. Note
tambm que como separamos os comandos um por linha, no precisamos mais colocar o
ponto-e-vrgula entre eles.
Cada um tem a liberdade de nomear os scripts sed como bem entender, no h um padro ou
norma. Mas para facilitar a identificao de seu contedo, aconselhvel utilizar a extenso .
sed. Este script de exemplo poderia se chamar seu-madruga-no-brasil.avi, mas bloco.sed
muito mais descritivo e apropriado, no concorda? &:)
59
Essa opo pode ser usada mais de uma vez na linha de comando, ento vrios scripts podem
ser usados no mesmo comando:
prompt$ sed -f arq1.sed -f arq2.sed -f arq3.sed texto.txt
O sed os interpreta seqencialmente, ou seja, a ordem de colocao dos vrios "-f" tem
importncia. Se o exemplo anterior fosse trocado para:
prompt$ sed -f arq3.sed -f arq2.sed -f arq1.sed texto.txt
60
O script abc.sed troca "abc" por "XXX" e o xxx.sed pega esse "XXX" e troca por "xyz". Como o
xxx.sed depende da alterao feita pelo abc.sed, ele precisa ser executado depois, seno no
haver "XXX" para ele trocar.
Alm de vrios "-f", tambm possvel colocar comandos normais junto na mesma linha de
comando utilizando a opo -e, e fazer uma salada de frutas. As regras continuam as
mesmas: a "ordem de chegada" importante. Acompanhe:
prompt$ cat a.sed
s/a/X/g
61
Para no se perder na ordem, basta lembrar que o sed est recebendo vrios pedacinhos de
comandos, mas hora de executar, uma coisa s. como se ele fosse recebendo vrios
bilhetinhos de papel com tarefas fazer. Cada bilhete novo recebido colado com durex no
final do anterior, at que todos tenham sido entregues. Ao comear a execuo dos
comandos, o sed ter uma grande folha remendada e disforme de tarefas a fazer.
62
Quem utiliza o comando ls com cores, vai notar que script agora ficou verdinho. sinal que
ele j um arquivo executvel. Para garantir, ou no caso de um ls sem cores, use o comando
ls -l e veja se as permisses do arquivo ganharam alguns "x", mudando de "-rw-rw-r--" para
"-rwxrwxr-x". Veja:
prompt$ ls -l meu-script.sed
-rw-rw-r-1 mussum
aa
284 Feb
prompt$ chmod +x meu-script.sed
2 17:10 meu-script.sed
63
284 Feb
2 17:10 meu-script.sed
Ok, temos um arquivo executvel. Mas ainda no informamos ao sistema que o sed quem
deve interpretar nosso script. Como fazer isso?
O shell, ao executar um arquivo, d uma olhadinha na primeira linha dele e v se os dois
primeiros caracteres so gradinha-exclamao #!. Se for, o restante dessa linha considerado
um comando de chamada, que diz ao shell como executar o arquivo. Funciona como um
manual de instrues para o shell ler &:)
Quem j tem alguma familiaridade com o shell e j fez ou viu algum script shell, certamente
conhece a primeira linha mgica que os torna especiais:
#!/bin/sh
Assim o shell sabe que precisa chamar o programa /bin/sh (que o prprio shell!) para
executar este arquivo. E isso funciona com qualquer outro comando do sistema. Ento para
um script sed, basta colocar como primeira linha o comando que normalmente usaramos
para interpret-lo:
#!/bin/sed -f
64
Note que preciso especificar o caminho completo do executvel do sed, pois o PATH no
levado em conta nesse momento. Pronto! O script agora um arquivo executvel legtimo.
Vamos test-lo?
prompt$ meu-script.sed texto.txt
bash: meu-script.sed: command not found
Opa! Como assim "comando no encontrado"? Ahhhh, que o diretrio corrente no est
includo no PATH do sistema, ento preciso colocar um ./ na frente do nome do script para o
shell encontr-lo:
prompt$ ./meu-script.sed texto.txt
Caso seu script fique muito bom (vai ficar, claro!) e voc o utilize com bastante freqncia,
copie-o para o diretrio dos programas de verdade para no precisar mais do ./ para chamlo:
prompt$ cp meu-script.sed /usr/bin
65
66
muito comum se precisar acompanhar em tempo real a apario das mensagens de log, para
diagnosticar problemas ou acompanhar eventos. Um utilitrio UNIX que faz isso o tail,
quando usado em conjunto com a opo -f. Ele monitora um arquivo, mostrando na tela cada
mensagem nova que aparece no fim do arquivo de registros.
Como geralmente um arquivo de registros mostra mensagens variadas, s vezes at com
excesso de informaes, torna-se necessrio o filtrarmos um pouco, e obter apenas as
mensagens relevantes nossa necessidade no momento. Opa, falou em filtro? Sed nele!
Um exemplo "da vida real" seria mostrar apenas as mensagens do sistema relativas s
conexes ssh:
prompt$ tail -f /var/log/messages | sed -nu '/sshd/p'
E claro, ao invs de simplesmente mostrar a linha, o sed tambm j podia edit-la, tirar partes
que no interessam, colocar cdigos de cores para destacar informaes, etcetcetc. Mas no
vou tirar do leitor o prazer de fazer sozinho essas fresc^W melhorias.
Ah, e cuidado com esse -nu perto de crianas! &:)
67
...
...
...
...
68
Por esse resumo j deu para perceber os furos de implementao no ? Mas antes de ver os
detalhes, vamos aprender a us-lo, comeando com um exemplo bem comum: incluir
cabealho e rodap num arquivo qualquer.
Estamos fazendo algumas pginas de internet, e percebemos que os textos do incio (ttulo,
menu de navegao) e o do final (contato) so sempre os mesmos para todas as pginas.
Como somos espertos, guardamos estes textos padro em arquivos separados
(cabecalho.html e rodape.html), e usamos o sed para inclui-los automaticamente nas nossas
pginas HTML! Um exemplo genrico seria:
prompt$ sed -e '1 r cabecalho.html' -e '$ r rodape.html' meio.html > pagina.html
Incluindo o cabealho no incio (aps a linha 1) e o rodap no final (aps a ltima linha). O
comando UNIX similar seria:
prompt$ cat cabecalho.html meio.html rodape.html > pagina.html
69
Tudo bem, o ponto-e-vrgula um caractere que pode aparecer no nome de um arquivo. Mas
ele tambm o caractere que delimita onde termina um comando sed e comea outro! E voc
acha que h uma maneira especial de colocar o ponto-e-vrgula no nome do arquivo para que
o sed no confunda com o separador de comandos? Ha-ha. No.
Com essa implementao descuidada, o resultado no mnimo incmodo. Nos quatro
exemplos seguintes, o trecho em destaque o "nome do arquivo" que o comando "r" de cada
um tentar ler:
sed '1 r cabecalho.html ; $ r rodape.html' meio.html > pagina.html
sed 'r /tmp/arquivo.txt ; s/abc/XXX/ ; 5d' texto.txt
sed 'r c:\temp\arquivo.txt ; 10q' texto.txt
sed 'r arquivo.txt ; 1,/End:/!d' texto.txt
Entendeu a dificuldade? O ponto-e-vrgula que deveria separar os comandos, entendido
como parte do nome do arquivo, ento no h caractere que sirva para terminar esse nome.
Com isso, o sed considera o "nome do arquivo" tudo o que vier depois do "r", at o fim da
linha.
70
Para contornar essa dificuldade, o comando "r" (assim como o seu irmo, o comando "w") deve
estar isolado, no havendo nada aps ele seno o nome do arquivo desejado. Num script sed,
basta quebrar a linha aps o nome do arquivo. Na linha de comando deve-se usar o -e para
separar as partes do comando sed.
Entendido isso, vamos ao prximo "detalhe": o contedo do arquivo mandado diretamente
para a tela. O ideal seria o sed ler o arquivo e colocar o seu contedo no espao padro, para
podermos manipul-lo. Mas ao invs disso o contedo simplesmente "jogado" para a sada,
sem controle, sem edio.
Obs.: O ssed e o gsed-4 implementaram essa funcionalidade de ler o arquivo para o
espao padro com o comando "R" (maisculo)
Mas no acaba a. Alm de jogar o contedo na sada sem controle, o sed faz isso de maneira
no seqencial tambm! Olha o absurdo:
prompt$ cat abc.txt
#### Eu sou o contedo do arquivo
#### abc.txt, de duas linhas.
prompt$ echo | sed -e 's/.*/ANTES/p ; r abc.txt' -e 's/.*/DEPOIS/'
ANTES
DEPOIS
#### Eu sou o contedo do arquivo
71
No tente entender, bug bug. E como esse um bug que vem desde os tempos mais
remotos do sed, dificilmente ser corrigido pois muitos scripts foram feitos baseados nessas
regras, e mud-las significa quebrar esses scripts.
72
Para finalizar a sesso de detalhes do comando "r", ele passa por cima da opo -n. Essa
opo deixa a sada do sed silenciosa, apenas mostrando texto quando especificado pelos
comandos "P p l". Na prtica vemos que o comando "r" imune a essa opo e mostra o
contedo do arquivo sempre.
prompt$ echo | sed -n 'r abc.txt'
#### Eu sou o contedo do arquivo
#### abc.txt, de duas linhas.
73
Mas antes dos detalhes, vamos ao uso. Por exemplo, se voc quer gravar num arquivo o
resultado de uma busca por linhas que contm a palavra "estorvo". O comando UNIX seria:
prompt$ grep 'estorvo' texto.txt > estorvos.txt
E o similar em sed:
74
Traduzindo: Para cada linha do arquivo texto.txt que encontrar a palavra estorvo, grave-a no
arquivo estorvos.txt.
Como irmo do comando "r", o "w" sofre do mesmo problema da especificao do nome do
arquivo e o ponto-e-vrgula. Isso quer dizer que se deve usar a opo -e para separar os
comandos, ou quebrar a linha quando utiliz-lo. Como no exemplo anterior o "w" era o nico
comando, a separao no foi necessria.
Uma outra utilidade de se gravar dados num arquivo a de servir como um espao auxiliar
caso voc j esteja usando o RESERVA e ainda precisa de outro cantinho para guardar dados
durante a execuo do script. Um exemplo clssico, se processar um documento
estruturado, com ttulos e sees, e no final imprimir uma lista de tpicos (TOC), apenas com
os ttulos:
prompt$ sed -e '/<H1>/ w /tmp/toc' -e '$ r /tmp/toc' documento.html
Neste exemplo simples, gravamos num arquivo temporrio todos os ttulos de um documento
HTML, que so identificados pela marca "<H1>". Somente quando estivermos na ltima linha
do arquivo ($), lemos o contedo do arquivo temporrio, que contm todos os ttulos
agrupados.
75
76
Como o primeiro comando diz que na linha 1 o script deve ser abortado (comando "q"), o
resto dele (comando "w") nunca chegar a ser executado. Mesmo assim, o arquivo /
tmp/arquivo ser zerado.
Esse comportamento impede que se utilize o mesmo arquivo para um comando r seguido de
um comando w, ou seja, mostrar seu contedo atual antes de grav-lo. Muito cuidado!
77
Quebra de linha
Lidar com quebras de linhas com certeza umas das tarefas mais chatas de se fazer com o
sed, chatas no sentido de se tomar cuidado e saber de algumas "pegadinhas".
Mmmmmm, ser que eu devo contar os segredos e desmistificar todo o assunto para voc? ...
Claro!
Para comear, a quebra de linha no pode ser casada, alis, pode. Ou melhor: depende.
Ento primeiro vamos entender o que exatamente uma quebra de linha. Temos o cifro $
que indica o fim da linha, que o que vem antes da quebra da linha. Lembre-se da mquina
de escrever, ao chegar ao final da linha voc puxa o bracinho e o carretel gira, esta seria a
quebra de linha, que no Linux j vem de brinde com o retorno do carretel. Trrrrrrr tshhhhhh
plin!
Ento se voc tem um arquivo como este:
- uma serra pequena
- um alicate de bico com cabo
de borracha
- uma chave de fenda
78
E quer juntar a linha do alicate que se quebrou, o que fazer? A tentativa bvia seria /alicate/
s/\n// para apagar o \n, mas isso no funciona. E lembrando que a primeira parte do comando
s nada mais do que uma busca, ento similarmente o endereo /cabo\nde borracha/ no vai
funcionar como esperado.
79
pa! Quase isso. Simplesmente apagar o \n vai grudar as duas palavras, ento o trocaremos
por um espao ao invs disso.
prompt$ sed '/alicate/ N ; s/\n/ /' arquivo
- uma serra pequena
- um alicate de bico com cabo de borracha
80
Aaaaaaaaah, agora sim. Vamos ver o debug para visualizar esse \n?
10
11
12
13
14
15
16
17
Como podemos ver l est a linha do alicate no padro (L10). Depois de aplicado o N (L12), l
veio a prxima linha, e ficou o \n enfiado no meio das duas (L13). Da ficou fcil, chegou o s
(L15) e trocou o separador pelo espao em branco (L16).
81
Ei, o sed est maluco, ele pegou de dois em dois! Vamos ver o que aconteceu:
1
2
3
4
PATT:um$
HOLD:$
COMM:N
PATT:um\ndois$
82
HOLD:$
COMM:s/\n/ /
PATT:um dois$
HOLD:$
um dois
PATT:trs$
HOLD:$
COMM:N
PATT:trs\nquatro$
Ele grudou a segunda linha (L4), apagou a quebra (L6) mas depois comeou de novo na
terceira linha (L10). claro! Sabemos que ao chegar ao final do script, o sed l a prxima linha
e volta para o comeo do script.
83
No sed da GNU esse script dar certo, mas em alguns seds ele sair com erro pois o N foi
aplicado na ltima linha (ver captulo do N). Ento colocaremos um condicional aqui, para no
aplicar o N na ltima linha: $!N, ou falando a lngua do sed: aplique o N para todas as linhas,
exceto a ltima.
:inicio ; $! N ; s/\n/ / ; b inicio
Mmmmmmm, para os j iniciados em programao, notaram que o que acabamos de fazer foi
um lao infinito? Se dissemos ao sed para sempre voltar ao comeo do script, ele far isso
infinitamente, consumindo toda a CPU de seu computador. Legal n? &:)
84
85
v
<destino>
Ei, se formos ver direto, essa sada do lao a mesma tcnica que foi usada no prprio lao!
Basta fazermos uma marca no fim e pularmos at ela:
__________________________________
/
\
|
v
:inicio ; $ b fim ; $! N ; s/\n/ / ; b inicio ; :fim
^
|
\__________________________________/
Ento estamos no lao, sempre voltando ao comeo, mas quando chegarmos na ltima linha,
pulamos para o fim. Ei ei ei! Notaram que na ltima linha pularemos direto para o fim e o N
nem ser executado? Sendo assim, ele no precisa mais daquele condicional que tnhamos
colocado antes:
prompt$ sed ':inicio ; $ b fim ; N ; s/\n/ / ; b inicio ; :fim' numeros.txt
um dois trs quatro cinco seis
86
Mas lembrando do problema do N na ltima linha, precisamos colocar de volta aquele outro
condicional esperto:
prompt$ sed ':inicio ; $! N ; s/\n/ / ; t inicio' numeros.txt
um dois trs quatro cinco seis
87
88
Ganhamos um espao em branco no comeo da linha que pode ser facilmente apagado com
um s/.// no final do script. Mas fora isso, como funciona o lao?
1
2
3
4
5
6
7
8
9
10
11
PATT:um$
HOLD:$
COMM:H
PATT:um$
HOLD:\num$
COMM:$ !d
PATT:dois$
HOLD:\num$
COMM:H
PATT:dois$
HOLD:\num\ndois$
89
PATT:seis$
HOLD:\num\ndois\ntrs\nquatro\ncinco$
COMM:H
PATT:seis$
HOLD:\num\ndois\ntrs\nquatro\ncinco\nseis$
COMM:$ !d
PATT:seis$
HOLD:\num\ndois\ntrs\nquatro\ncinco\nseis$
COMM:g
PATT:\num\ndois\ntrs\nquatro\ncinco\nseis$
HOLD:\num\ndois\ntrs\nquatro\ncinco\nseis$
COMM:s/\n/ /g
PATT: um dois trs quatro cinco seis$
HOLD:\num\ndois\ntrs\nquatro\ncinco\nseis$
um dois trs quatro cinco seis
90
Ao chegar na ltima linha, ela tambm ser juntada no reserva, mas agora o condicional $!d
faz com que o d no seja aplicado, ento o script pode continuar finalmente para o prximo
comando g (L39). Com ele, recuperamos todo o contedo do nosso estoque de linhas, e o
prximo comando s se encarrega de trocar todos (note o modificador s///g) os \n do padro
por espaos de uma s vez (L43).
Resumindo: estocamos as linhas no reserva, pegamos de volta e formatamos.
91
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
92
MAISCULAS/minsculas
A princpio parece ser um assunto to bobinho, que no tem muito o que falar, mas a
experincia mostra que o assunto maisculas/minsculas sempre vai render problemas e
solues diversos. Vamos fazer um apanhado de todos os tpicos que envolvem o assunto, e
no deixar nem uma sombra de dvida no caminho.
Vamos comear com a notao, que pode ser novidade para muitos. Como vamos falar de
tipos de caracteres e converses entre eles, a linguagem tipogrfica serve para definirmos os
termos que identificam as aes e elementos do maravilhoso mundo das letras. Ento vamos
l: letras em maisculas so letras com caixa alta, e em minsculas, caixa baixa. Ento
inverter a caixa o nome que se d troca de maisculas por minsculas e vice-versa.
Destes termos tambm podemos derivar: levantar a caixa, que seria a "maiusculizao"
(toupper) e abaixar a caixa seria a "minusculizao" (tolower).
93
Este comando trocar as letras com acento agudo pela prpria letra sem acento. Diferente do
comando s///, que "troque isso por aquilo", o y/// "para cada letra daqui, troque-a pela de
l". Ento no comando anterior, estamos dizendo ao sed: "troque por a, troque por e,
troque por o".
Outra diferena do s, em que se tem controle sobre o nmero de substituies que sero
feitas, com o y tudo ou nada, ele converte todas as letras da linha que estiverem no
comando. Veja:
prompt$ echo AAAABBBAAAA | sed 'y/AB/ab/'
aaaabbbaaaa
94
E o y sempre assim, em pares. Por isso sempre deve haver o mesmo nmero de letras na
primeira e na segunda parte do comando, seno o sed acusar erro.
Outro detalhe que o y por causa dessa paridade, s aceita caracteres literais. Nada de
expresses regulares ou qualquer outro caractere especial. Ento o comando similar ao tr
invlido:
sed 'y/A-Z/a-z/'
# ERRADO!
Este comando diz: "troque A por a, troque - por -, troque Z por z", e s. Para conseguirmos
converter de maisculas para minsculas, temos que colocar todas as letras, uma por uma.
Sim, isso muito chato.
sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'
Essa minhocona far o servio de deixar todo o texto em caixa baixa. Ser que voc est bem
atento? Apesar de j estar um comando gigantesco, no est faltando nada a no? claro!
Esto faltando nossas queridas letras acentuadas. Se no as colocarmos, continuaro em caixa
alta mesmo aps a converso. Respire fundo, vamos l:
sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'
95
Ufa! Quanta coisa para resolver algo aparentemente to simples. Caso tenhamos nos perdido
no meio do caminho, e olha que isso muito fcil de acontecer, o sed avisar:
sed 'y/FGHI/fg/'
sed: -e expression #1, char 10: strings for y command are different lengths
Para fazer o caminho inverso, deixando tudo em maisculas, basta inverter as partes do
comando:
sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'
Uma dica muito, mas muito boa para a utilizao do y, usar outro delimitador. Assim como
para endereos e para o comando s, podemos usar qualquer caractere ASCII como delimitador
do comando. Ento ao invs da barra /, use a quebra de linha como delimitador:
sed 'y
abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
'
Assim facilita muito, j ficando visualmente notvel caso as duas partes do comando tenham
tamanhos diferentes, e tambm visualizamos na hora quais so os pares de caracteres, pois
esto um embaixo do outro.
96
Claro que para digitar na linha de comando, ficar quebrando linhas assim incmodo, mas
dentro de um arquivo, a melhor opo para no confundir.
97
Beleza! Ento para fazer o superconversor basta pacientemente compor a superminhoca num
superscript!
# inverte_caixa.sed
(dica: usa quebra de linha como separador)
y
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
Admita: o sed lindo no ? Temos um script de apenas 3 linhas, sem nenhum smbolo,
apenas letras. E isso inverte a caixa de todas as letras. Vamos testar?
prompt$ echo "SED significa Stream EDitor" | sed -f inverte_caixa.sed
sed SIGNIFICA sTREAM edITOR
98
Com a primeira letra isolada, agora podemos levantar sua caixa tranquilamente com a famosa
minhocona y/abcde.../ABCDE.../.
Beleza, ento agora temos que voltar o resto da linha que est no RESERVA, mas antes temos
que tambm retirar a primeira letra dela, pois ela uma cpia da linha original lembra?
Devemos trocar os registradores de lugar e apagar a letra:
x ; s/^[a-z]//
Certo, agora basta grudar o PADRO no RESERVA (comando H), e apagar o \n que vai ficar
entre eles:
H ; g ; s/\n//
100
Sem querer ser chato mas sendo, esse script ainda no 100% funcional. At aqui assumimos
que geralmente a primeira letra da frase j est bem no comeo da linha. Mas como isso nem
sempre verdade, temos que melhorar nossa expresso regular ^[a-z].
Antes da primeira letra, podemos ter espaos em branco, ento prudente tambm colocar
esta condio na expresso: ^ *[a-z]. , mas alm de espaos, tambm podem ter TABs, ento
melhor garantir e fazer ^[[:blank:]]*[a-z]. E o monstro vai crescendo...
Sendo mais chato ainda: e os acentos? Temos palavras no portugus que comeam com
acentos? Deixa ver: gua, poca, dio, cio, rbita... cus, tambm precisamos incluir os
acentos para que nosso script no falhe. Vamos l: ^[[:blank:]]*[[:lower:]]. Agora chega!
Esse monstrinho representa a primeira letra de uma linha.
Vamos atualizar nosso script com essa informao nova. Ah! Lembre que o y/// agora tambm
precisar conter os caracteres acentuados!
# _L_inha.sed
101
h ; s/^\([[:blank:]]*[[:lower:]]\).*/\1/
;# guarda cpia, deixa s a primeira letra
y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
x ; s/^[[:blank:]]*[[:lower:]]//
;# arranca a primeira letra da cpia
H ; g ; s/\n//
;# remonta a linha
Que trabalheira para fazer uma coisa to simples hein? Pois , essa a eterna diverso de se
usar o sed &:D Apenas como comparativo, para fazer a mesma coisa no vim basta um s/
[[:lower:]]/\u&/.
102
O primeiro sed quebra a linha em cada palavra, deixando uma por linha
O segundo sed o _L_inha.sed do tpico anterior, j que temos uma palavra por linha
O terceiro sed reajuntar as palavras numa linha.
O grande conselho : use outro programa. Mas se o sed a nica opo, ou se S&M significa
algo para voc, vamos l!
Para quebrar a linha em cada palavra, temos um carinha muito til que o \<, que representa
um "incio de palavra", ento basicamente trocamos um "incio de palavra" por uma "quebra de
linha". Na lngua do sed, isso :
# uma-palavra-por-linha.sed
s/\</\
/g
103
E claro, para juntar todas as linhas, h vrias opes descritas no tpico "Como apagar todas
as quebras de linha, deixando tudo numa s linha". Colocando uma verso compacta do lao
com condicional de entrada, temos:
# junta-linhas.sed
:i ; $!N ; s/\n/ / ; ti
Se possvel, bom colocar todos estes comandos dentro de um script shell, e ento voc ter
quatro arquivos para fazer uma tarefa simples!
#!/bin/sh
104
E j que chegamos at aqui, podemos ter apenas um arquivo, colocando o contedo dos trs
seds direto dentro do script shell:
#!/bin/sh
# _P_alavra.sh - levanta a caixa da primeira letra de cada palavra
sed 's/\</\
/g' |
sed '
h ; s/^\([[:blank:]]*[[:lower:]]\).*/\1/
y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
x ; s/^[[:blank:]]*[[:lower:]]//
H ; g ; s/\n//' |
sed ':i ; $!N ; s/\n/ / ; ti'
106
J imaginou todo esse trabalho s para pesquisar um texto? Infelizmente para uma grande
parte das verses de sed existentes, isso ou...
Se a sada puder ser toda em minsculas ou maisculas, outra ttica antes de mais nada
usar o comando y para converter a linha toda do arquivo de texto todo para maisculas, e
usar o padro tambm em maisculas. Essa ttica muito usada em programao, para
comparar contedo de variveis, por exemplo:
if ( toupper($comando) == 'SELECT' ) ; then ...
107
Em sed, seria:
# aps ler a linha do arquivo texto, levante sua caixa
y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
# procure o padro e execute os comandos
/MEU-PADRAO/ {
...
}
Mas para alvio dos amantes do sed, os programadores da GNU incluram um modificador
especial de endereo I (de Ignore-case) a partir da verso 3.01-beta1. A sintaxe pode parecer
estranha, mas acostuma. No endereo, basta colar o modificador I logo aps fechada a
segunda barra delimitadora:
prompt$ sed '/root/I d' texto.txt
E tambm no comando s///, temos o mesmo modificador I, que pode ser includo no final,
junto com os outros modificadores j existentes g, p, w, ou nmeros. Dessa maneira a primeira
parte do comando, que nada mais seno um endereo, pesquisada ignorando a caixa das
letras. Exemplo:
prompt$ sed 's/root/administrador/Ig' texto.txt
108
Cumbuca
Aqui aquela seo que voc vai ler agora apressadamente, e depois quando precisar, vai
voltar para procurar um exemplo.
109
Exemplos teis
"Olha, no que eu seja preguioso, eu j aprendi bastante coisa de sed, j me viro sozinho,
manjo de fazer endereos, de fazer scripts sed e tudo mais. Mas ser que no dava pra
colocar num cantinho a uns exemplinhos mastigados daquelas tarefas bem rotineiras e
chatas?"
Apagar todas as tags HTML
s/<[^>]*>//g
/VERDE/= ; d
/^ *$/d
/^ *#/d
/VERDE/s/^/#/
Desacentuar um arquivo
y//
AAAAEEIOOUUCaaaaeeioouuc/
H ; $!d ; g ; s/\n/ /g
s/[][]//
s/\[[^]]*]//
s/^[\[[0-9;]*m//
110
|
|
|
|
|
|
|
|
|
sed
sed
sed
sed
sed
sed
sed
sed
sed
y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
s/ \+/ /g
H;$!d;g;s/\n//g
-n $=
x;G;/^\(.*\)\n\1$/d;g
/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//
s,.*/,,
s,[^/]*$,,
w arquivo-novo
112
Agradecimentos
Em Outubro de 2002, alguns amigos toparam ajudar com o livro. Eu lhes mostrei o texto e
eles sugeriram melhorias, arrumaram erros ortogrficos e fizemos uma grande discusso que
resultou no aumento de qualidade do contedo. A esse grande time meu MUITO OBRIGADO:
113