shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: RES: [shell-script] sed ou grep?Again...


From: Eliphas Levy Theodoro
Subject: Re: RES: [shell-script] sed ou grep?Again...
Date: Fri, 21 Jul 2000 18:28:52 -0300 (BRST)

Julio Cezar Neves - DISB.O, @ 16:07:

> > De:         Renato Alvim [SMTP:address@hidden]

> > Quero localizar a linha que contem o gerenciador de janelas escolhido,
> > descomente-a, mas terei que localizar tambem a linha que contem o
> > atualmente em
> > uso e comenta-la.
> > 
> > Num livrinho da Editora Escala, desses que vendem na banca de jornais,
> > ha uma rapida informacao sobre o comando sed.Algo assim :
> > sed -s/Andre/Wagner/ < arquivo.texto substituiria todas as ocorrencias da
> > palavra Andre pela palavra Wagner, no arquivo.

>       Renato, não é bem assim! A expressão regular deve vir entre aspas ou
> apóstrofos para que o shell não a interprete, e sim o sed. Mesmo q vc

não é estritamente necessário, mas recomendável. o shell vai expandir o que
ele puder e você tem de estar ciente disso. mas no caso acima nada seria
expandido, só se houvesse alguns '*' ou '?'.

> tivesse feito desta forma, vc trocaria somente a 1a. ocorrencia de Andre em
> cada linha. Para globalizar a pesquisa exista o parâmetro "g". Assim, para
> trocar todas as ocorrências de Andre por Wagner vc deveria fazer:
> 
>       sed '1,$s/Andre/Wagner/g' ArqNomes
>       onde "1,$" significa da 1a. à última linha e é opcional e o "g" é
> para pesquisar todas as ocorrencias de Andre em cada linha.

>       Vai ai uma definição um pouco + detalhada:
>       sua sintaxe geral é:

pulando a descrição detalhada...

>       Suponha q o seu .xinitrc esteja assim:
>       # exec gnome-session
>       exec icewm
>       # exec blackbox
>       # exec kfm
>       e vc queira comentar o icewm e descomentar o kfm. Então:
>       sed 's/^exec icewm/# exec icewm/' .xinitrc | sed 's/^# exec kfm/exec
> kfm/'
>       onde o "^" serve somente para dizer que a pesquisa esta sendo feita
> no início de cada linha.

eu faria um pouquinho diferente, já que não sabemos qual seria a linha que
já estava descomentada:

cp -a .xinitrc .xinitrc.bkp                        # preserva permissões
sed "s/^[^#]/#\0/; s/#exec $WM/exec $WM/" .xinitrc.bkp > .xinitrc

note as aspas duplas no segundo item. eu gosto de usar sempre aspas simples,
e quando preciso que o shell expanda uma variável, como no exemplo, uso as
duplas. isso ajuda a saber onde não é só o sed que está agindo.

explicação das expressões regulares:
s/    substitua
^[^#] algo começando (^) por algo que não seja # ([^#])
/     por
#\0   um # e o conteúdo acima (do não-#)
;     e...
s/    substitua
#...  a linha tal
/     por
ex... a linha tal


mais sobre sed? address@hidden ':)

-- 
>>> from conectiva import eliphas
>>> print eliphas.commandline
$ vi .bashrc
>>> print eliphas.url+" - "+eliphas.uin+" "+eliphas.linuxuser
http://www.conectiva.com.br/~eliphas - 4856656 88709



reply via email to

[Prev in Thread] Current Thread [Next in Thread]