Você pode ordenar suas mensagens por data? Basta clicar no link da coluna data. Suas preferências serão lembradas para que você não precise fazer isso novamente sempre que retornar.
ontem fiz um carinha para mostrar os links de um sítio de
internet local. pode ser útil para quem desenvolve em html.
e é útil pra quem quer aprender sed também pois é simples.
a cópia original está em
http://www.conectiva.com.br/~aurelio/programas/bash
#!/bin/sh
# showlink
# 19991012 <aurelio@...> ** 1a versão
#
# a bash+find+egrep+sed utility to webdesigners.
# showlink shows all kind of links on a web site.
# it gets all *html pages above the current dir.
# you can parse its output to find lost links, do
# statistics, find errors, or just for curiosity &:)
#
# a quick example:
# cp showlink /bin ; cd /home/httpd/html ; showlink -a
Usage(){ echo "$0 OPTION (just one option)
-a,--all all links found
-c,--chk check for incorrect links
-d,--dir links that point to directories
-e,--email links that point do emails (mailto:)
-f,--ftp links that point do external pages (ftp://)
-h,--http links that point do external pages (http://)
-i,--image links that point do images
-m,--music links that point do music files
-p,--page links on the same page
-z,--zzz links marked with ??? (todo link)
--help this help
UPPERCASE single option (-[ACDEFHIMPZ]) give the output without the
filename. i.e. \"`basename $0` -A\"
" ; exit 1
}
[ "$1" ] || Usage
OPT=$1
### the defaults for full output - do NOT edit!
# the delimiter beetween the filename and the link found
D=':'
# options passed to the egrep command. this is related to
# case of the option passed on the command line. lowercase
# is the default: show filename (H option). uppercase
# supresses it.
EGREP_OPTS='-His'
# the egrep pattern is only 'href=' and not '<a[^I ]\+href='
# or something to support multiline like <a
# href="link.html", and also, the "" are not included to you
# see when you missed them on the html source (all the line
# will appear on the output).
EGREP_PATT='href='
# this filter parses the egrep output to only extract the
# link itself: the string beetween the "".
EGREP_FILTER="s§\(^[^:]*\):.*href=\"[ ]*\([^ \"]*\)[ ]*\".*§\1$D\2§"
# this filter is the action related to the option passed on
# the command line. here is the "sedmagic". 'p' is the default,
# and show all links. the true magics are on the 'case' below.
SEDMAGIC='p'
# let's see if we have a UPPER option and set the filters to it
OPT2=`echo ${OPT#-} | sed 'y/ACDEFHIMPZ/acdefhimpz/'`
if [ "${OPT#-}" != "$OPT2" ]
then OPT=-$OPT2
D='^'
EGREP_OPTS='-is'
EGREP_FILTER="s§^.*href=\"[ ]*\([^ \"]*\)[ ]*\".*§\1§"
fi
# sedmagics here!
case $OPT in
-a|--all ) : ;; # it uses the defaults
-c|--chk ) SEDMAGIC="\§${D}/[^/]§p" ;; # TODO: more checks
-d|--dir ) SEDMAGIC="\§${D}[^.#]\+$§p" ;;
-e|--email) SEDMAGIC="\§${D}mailto:§p" ;;
-f|--ftp ) SEDMAGIC="\§${D}ftp://§p" ;;
-h|--http ) SEDMAGIC="\§${D}http://§p" ;;
-i|--image) SEDMAGIC='\§\.\(jpg\|gif\|png\|bmp\)$§p';;
-m|--music) SEDMAGIC='\§\.\(ra\|rm\|mp3\|wav\)$§p' ;;
-p|--page ) SEDMAGIC='\§#§p' ;;
-z|--zero ) SEDMAGIC='\§???§p' ;;
*) Usage ;;
esac
FILES=`find . -type f -name "*html"`
# and after all this preparations, the brain is here
# ah! no support for spaced filenames, but who cares?
for F in $FILES
do egrep $EGREP_OPTS $EGREP_PATT $F |
sed "$EGREP_FILTER" |
sed -n "$SEDMAGIC"
done
--
s/&:(/&>(/g,aurelio@...
http://www.conectiva.com.br/~aurelio
"indignação_movendo_a_nação"<ESC>:wq
Em 12/10/99 às 23:38, Ademar de Souza Reis Jr. escreveu:
> Hi All.
êrba. ':)
> Comecei a usar o centerICQ (cliente ICQ pra console textual), mas queria
> converter todos os meus UINs jah existentes do Licq pro arquivo de
> contacts do centerICQ.
>
> Fiz o seguinte script, mas tenho certeza que isso podia ser feito via sed
> ou sei lah oq...
bom, aproveitando, também fiz um pra conversão licq -> zicq:
licq2zicq.sh:
------------------8<======================================
#!/bin/sh
LICQ_DIR=~/.licq/conf
ZICQ_RC=~/.zicqrc
cd $LICQ_DIR
for uin in [0-9]*;do
echo -n $uin
grep -i alias $uin
done | \
sed 's/\([0-9]*\).*= \(.*\)/\1 \2/ ; s/^I/_/g' | \
sort -n >> $ZICQ_RC
==================>8--------------------------------------
ou seja, busca no diretório do licq todos os arquivos começando com números;
acha a linha 'alias' dentro de cada um deles;
forma a linha 'UIN alias= nome';
joga isso tudo em um único sed;
ele separa os números (uin) no início, e o nome após o igual;
também retira os espaços e substitui por sublinhas;
substitui todos os tabs por espaços;
no final, ordena pelo UIN e joga no final do .zicqrc.
só lembre-se de trocar o ^I acima por um TAB verdadeiro. (no vi, ^VTAB)
pra fazer pro centericq, deve ser preciso mudar pouca coisa.
--
Conectiva - Theodoro, Eliphas Levy | \
sed 's/\([A-z]*\) - \([A-z]*,\) \([A-z]*\) \([A-z]*\)/\3 \4 \2 \1/'
Você moveu seu mouse. Reinicie para que as alterações tenham efeito.
-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCM/U d--- s:- a23 C+++ UL+++$ P+>$ L++> E--- W- N- !o !K w--- O- M- V?
PS+ PE Y-- PGP t+ 5+ X+ R+ tv- b DI+ D+++ G e-- h+ r- y+
------END GEEK CODE BLOCK------
Em 13/10/99 às 10:09, aurelio marinho jargas - ctba escreveu:
>
> @ 12/10, Ademar de Souza Reis Jr.:
> > Comecei a usar o centerICQ (cliente ICQ pra console textual), mas queria
> > converter todos os meus UINs jah existentes do Licq pro arquivo de
> > contacts do centerICQ.
> >
> > Fiz o seguinte script, mas tenho certeza que isso podia ser feito via sed
> > ou sei lah oq...
> >
> > # inicio
> > > ~/.center/contactlist
> > for i in *.uin
> > do
> > a=`grep Alias "$i" | cut -d " " -f 3`
> > b=`echo $i | cut -d . -f 1 | grep [0-9]`
> > echo -n $a >> ~/.center/contactlist
> > echo -e \\t \\t $b >> ~/.center/contactlist
> > done
> > # fim
>
> como somente com o sed não é possível obter o nome do
> arquivo via comandos para colocá-lo dentro do roteiro sed,
> tem-se que usa o for de qualquer jeito.
>
> for i in *.uin
> do sed -n "s§Alias = \(.*\)§\1 $i§p" >> ~/.center/contactlist
> done
a linha do sed nao funcionou.
faltou colocar o nome do arquivo (no caso $i) antes do redirecionamento :)
devia ser:
do sed -n "s§Alias = \(.*\)§\1 $i§p" $i >> \
~/.center/contactlist
outro detalhe eh q aparece o .uin na linha de saida, eh isso tem q sair.
Saiu algo do tipo
Ademar xxxxx.uin
Nao tive tempo pra mexer nem pra entender direito oq isso faz, entao pode
ter algo de falta de atencao da minha parte :)
> * o caractere § é o delimitador do s§isso§aquilo§
Pergunta idiota:
De onde tiro o caractere "§" ?
Nao sei seh pq to com muuuito sono, mas nao to vendo ele aqui no meu
teclado :)
(us-acentos - sem teclas win95)
> > Alguem tem a solucao em uma linha apenas? :)
>
> 3 tá bom? &:)
Dah pra quebrar o galho :P
[]'s
==============================================
Ademar de Souza Reis Jr.
http://members.xoom.com/ademarjr
Estudante de Informatica / Bolsista PET - UFPR
Happy Linux Home User #71790
ademar@...
Curitiba - PR - Brasil
--
"Se NT é a resposta, você não entendeu a pergunta"
> > for i in *.uin
> > do sed -n "s§Alias = \(.*\)§\1 $i§p" >> ~/.center/contactlist
> > done
>
> a linha do sed nao funcionou.
>
> faltou colocar o nome do arquivo (no caso $i) antes do redirecionamento :)
é verdade. sempre me esqueço disso &:)
> do sed -n "s§Alias = \(.*\)§\1 $i§p" $i \
> ~/.center/contactlist
>
> outro detalhe eh q aparece o .uin na linha de saida, eh isso tem q sair.
> Saiu algo do tipo
> Ademar xxxxx.uin
>
> Nao tive tempo pra mexer nem pra entender direito oq isso faz, entao pode
> ter algo de falta de atencao da minha parte :)
não, é coloquei simplesmente $i, que é o nome do arquivo,
para tirar o .uin do final, basta por ${i%.uin}, então fica
do sed -n "s§Alias = \(.*\)§\1 ${i%.uin}§p" $i \
~/.center/contactlist
> > * o caractere § é o delimitador do s§isso§aquilo§
> Pergunta idiota:
> De onde tiro o caractere "§" ?
Alt da direita + =
> > > Alguem tem a solucao em uma linha apenas? :)
> > 3 tá bom? &:)
> Dah pra quebrar o galho :P
&:)
--
s/&:(/&>(/g,aurelio@...
http://www.conectiva.com.br/~aurelio
"indignação_movendo_a_nação"<ESC>:wq
Preciso recuperar por exemplo a linha 10 de um arquivo como faço?
Ricardo Soares Guimarães
mailto:ricardo@...
mailto:ricardo@...
http://www.universolinux.com.brhttp://www.opensystem.org.br
"A certeza de que vou morrer é a maior dádiva que recebi. Porque assim,
eu sou obrigado a aproveitar cada segundo de minha vida."
da próxima vez, faça um assunto mais descritivo para
facilitar uma busca no histórico
> Preciso recuperar por exemplo a linha 10 de um arquivo como faço?
há 2 maneiras:
sed -n 10p # corta a saída padrão e imprime o padrão
sed 10!d # corta tudo menos o padrão
1º caso:
-------
-n suprime a saída padrão, só o comando p imprimirá algo
10p o p imprime e aceita um endereçamento (no caso a linha 10)
esse endereçamento pode ser
10 somente a linha 10
1,10 da linha 1 a 10
/padrão/,10 da 1ª linha que tiver "padrão" até a 10
2ª caso:
-------
10 endereçamento
! não faça o comando seguinte (negação)
d apague a linha corrente
então fica, "na linha 10, não apague", ou melhor
"fora a linha 10, apague"
--
s/&:(/&>(/g,aurelio@...
http://www.conectiva.com.br/~aurelio
"indignação_movendo_a_nação"<ESC>:wq
Em 14/10/99 às 12:06, aurelio marinho jargas - ctba escreveu:
> 1º caso:
> -------
> -n suprime a saída padrão, só o comando p imprimirá algo
> 10p o p imprime e aceita um endereçamento (no caso a linha 10)
>
> esse endereçamento pode ser
>
> 10 somente a linha 10
> 1,10 da linha 1 a 10
> /padrão/,10 da 1ª linha que tiver "padrão" até a 10
só complementando, pode ser também por 'passos', ou seja:
1~2 imprime somente as linhas ímpares, começando na primeira;
10~10 imprime a décima, vigésima, etc...
5~20 vai imprimir a quinta, a vigésima quinta, a quadragésima quinta...
nessa parte de 'steps', tá até bem explicadinho no 'man sed'. ':)
--
Conectiva - Theodoro, Eliphas Levy | \
sed 's/\([A-z]*\) - \([A-z]*,\) \([A-z]*\) \([A-z]*\)/\3 \4 \2 \1/'
Você moveu seu mouse. Reinicie para que as alterações tenham efeito.
-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCM/U d--- s:- a23 C+++ UL+++$ P+>$ L++> E--- W- N- !o !K w--- O- M- V?
PS+ PE Y-- PGP t+ 5+ X+ R+ tv- b DI+ D+++ G e-- h+ r- y+
------END GEEK CODE BLOCK------
Taih uma coisa q eu ateh hoje nao descobri como se faz....
Tudo bem q nao eh relacionado diretamente ao sed, mas achei q era a melhor
lista pra se fazer esse tipo de pergunta.
Alguem tem a solucao? Se possivel, como direcionar ambos (saida e erro
padrao) prum pipe?
Tipo
gcc -foo.c -o bar | grep xxxx
[]'s
==============================================
Ademar de Souza Reis Jr.
http://members.xoom.com/ademarjr
Estudante de Informatica / Bolsista PET - UFPR
Happy Linux Home User #71790
ademar@...
Curitiba - PR - Brasil
--
"Se NT é a resposta, você não entendeu a pergunta"
On Sat, 16 Oct 1999, Ademar de Souza Reis Jr. wrote:
>
> Taih uma coisa q eu ateh hoje nao descobri como se faz....
>
> Tudo bem q nao eh relacionado diretamente ao sed, mas achei q era a melhor
> lista pra se fazer esse tipo de pergunta.
>
> Alguem tem a solucao? Se possivel, como direcionar ambos (saida e erro
> padrao) prum pipe?
>
> Tipo
>
> gcc -foo.c -o bar | grep xxxx
>
gcc -foo.c -o bar | grep xxx 2>&1
assim a saida 2 (stderr) tambem vai para a saida 1 (stdout)
Wanderlei Antonio Cavassin
Conectiva
Hoje, às 00:12, Wanderlei Antonio Cavassin escreveu:
> On Sat, 16 Oct 1999, Ademar de Souza Reis Jr. wrote:
> >
> > Taih uma coisa q eu ateh hoje nao descobri como se faz....
> >
> > Tudo bem q nao eh relacionado diretamente ao sed, mas achei q era a melhor
> > lista pra se fazer esse tipo de pergunta.
> >
> > Alguem tem a solucao? Se possivel, como direcionar ambos (saida e erro
> > padrao) prum pipe?
> >
> > Tipo
> >
> > gcc -foo.c -o bar | grep xxxx
> >
>
> gcc -foo.c -o bar | grep xxx 2>&1
>
> assim a saida 2 (stderr) tambem vai para a saida 1 (stdout)
>
Eu jah havia tentado isso e nao funcionou.
Se eu nao estou errado, assim vc tah jogando o erro do grep pra stdout,
mas eu quero jogar o erro do gcc na entrada do grep.
Oq eu queria era o equivalente a:
[ademar@optimus ademar]$ /usr/bin/gcc foo.c -o bar &> erro
[ademar@optimus ademar]$ cat erro | grep xxxx
[ademar@optimus ademar]$
OPA! Caiu um raio na minha cabeca agora! :)
[ademar@optimus ademar]$ /usr/bin/gcc foo.c -o bar 2>&1 | grep such
gcc: foo.c: No such file or directory
[ademar@optimus ademar]$
[ademar@optimus ademar]$ /usr/bin/gcc foo.c -o bar 2>&1 | grep -v such
gcc: No input files
[ademar@optimus ademar]$
ah... Agora sim! :)
De qquer modo, valeu a ajuda, foi soh eu entender oq tava acontecendo pra
sair a solucao correta. :)
[]'s
==============================================
Ademar de Souza Reis Jr.
http://members.xoom.com/ademarjr
Estudante de Informatica / Bolsista PET - UFPR
Happy Linux Home User #71790
ademar@...
Curitiba - PR - Brasil
--
"I use Linux because reboots are for hardware upgrades"
não é sed, é uma ER em python, mas também se aplica ao sed, sobre a
importância da ordem em que se coloca as alternativas, pois sempre a
primeira encontrada é a que vale:
tipo:
echo ab | sed 's§\(a\|b\)§\1§' ---> a
echo ab | sed 's§\(b\|a\)§\1§' ---> b
as duas casam OU 'a' OU 'b', mas a ordem dentro dos ()s importa.
----------------------------------------------------------------------
com prazer!
essa é a string na qual será feita a pesquisa:
entry = 'parted-0.0.8-pre1/po/parted.pot'
aqui estão as 2 REs:
re.match('parted-([.0-9]+[a-z]?|[.0-9]+-b[0-9]+|[.0-9]+-pre[0-9]+)',
entry).group(1)
re.match('parted-([.0-9]+-b[0-9]+|[.0-9]+-pre[0-9]+|[.0-9]+[a-z]?)',
entry).group(1)
pelo que entendi, aqui está se explicando a importância da ordem em
que as alternativas são colocadas, porque as 2 REs são idênticas,
apenas mudando a ordem em que aparecem as 3 alternativas
dentro do primeiro agrupamento de (isso|aquilo|outro)
o cano '|' lê-se 'ou' - e com isso o resultado se altera, pois ele
casa sempre a primeira que encontrar.
ele casa a string 'parted-'
depois alternativamente ele pode casar:
ou [.0-9]+[a-z]? '.' ou núm. (1 ou mais), e opcional 1 letra
ou [.0-9]+-b[0-9]+ '.' ou núm. (1 ou mais), '-b' , núm. (1 ou mais)
ou [.0-9]+-pre[0-9]+ '.' ou núm. (1 ou mais), '-pre', núm. (1 ou mais)
o group(1) serve para pegar o conteúdo do agrupamento 1 (como o \1 no
sed)
e os resultados são
'0.0.8' e '0.0.8-pre1'
o primeiro casando com a primeira alternativa acima (núms e letra
opcional) e o segundo casando com a terceira alternativa acima (núms,
pre- e núms)
re.match('parted-([.0-9]+[a-z]?|[.0-9]+-b[0-9]+|[.0-9]+-pre[0-9]+)',
entry).group(1)
resultado: '0.0.8'
re.match('parted-([.0-9]+-b[0-9]+|[.0-9]+-pre[0-9]+|[.0-9]+[a-z]?)',
entry).group(1)
resultado: '0.0.8-pre1'
só é meio misturado, mas é fácil não?
> depois me explica!
>
> On Wed, 20 Oct 1999, aurelio marinho jargas - ctba wrote:
>
> >
> > e olhando a 1ª vista parece ser complicadíssima, mas só usa funções
> > básicas como classes e alternativas. isso é muito massa &:)
> >
> > > Expressao regular bonitinha...
> > > Cavassin
> >
> > > >>> entry = 'parted-0.0.8-pre1/po/parted.pot'
> > > >>> re.match('parted-([.0-9]+[a-z]?|[.0-9]+-b[0-9]+|[.0-9]+-pre[0-9]+)',
entry).group(1)
> > > '0.0.8'
> > > >>> re.match('parted-([.0-9]+-b[0-9]+|[.0-9]+-pre[0-9]+|[.0-9]+[a-z]?)',
entry).group(1)
> > > '0.0.8-pre1'
--
s/&:(/&>(/g,aurelio@...
http://www.conectiva.com.br/~aurelio
"indignação_movendo_a_nação"<ESC>:wq
------------------------------------
NOVA! http://www.brasmidia.com/dumbs
repensei aquele sed que pega o email de um cara do cabeçalho da
mensagem (filtro_suporte) e _acho_ que cheguei num sed genérico o
suficiente e consistente (e bem mais esperto e entendível):
echo " \"au-re.lio\" <(a_u-re.lLio@cNN_-nc.com)> lala" |
sed "s§.*[^-A-z._]\([-A-z._]\+@[-A-z._]\+\).*§\1§"
assumindo que os caracteres válidos para usuário e domínio são
-A-z._
dá uma testada aí por favor (só não quebre o vidro do monitor) &;)
--
s/&:(/&>(/g,aurelio@...
http://www.conectiva.com.br/~aurelio
"indignação_movendo_a_nação"<ESC>:wq
------------------------------------
NOVA! http://www.brasmidia.com/dumbs
a aí moçada.
seguinte, para desenvolvermos nosso conhecimento em sed, vou
"tentar" postar toda semana (ou a cada 2 semanas) exercícios em sed
para exercitar seus neurônios. &:)
como sempre, o tópico é sed e ERs. e como sempre, pode haver inúmeras
maneiras de se fazer a mesma coisa, como o clássico: "imprimir as
primeiras 10 linhas do arquivo tal?"
vamos tentar começar com uns menos complexos e depois vamos vendo
conceitos mais avançados.
quem conseguir alguma resposta, poste para a lista e vamos discuti-la.
ganha a resposta:
- que for mais específica e consistente
- que utilizar menos caracteres
- que funcionar &:)
EXERCICIO 1:
das URLs, uma por linha:
http://www.conectiva.com.brftp://caicom.com/pub/linuxhttp://linux.orghttp://www.redhat.com
extrair o nome da "empresa" ou instituição de cada uma. o resultado
será:
conectiva
caicom
linux
redhat
para tornar as coisas mais quentes, sua expressão NÃO deve casar essas
entradas:
clique <a href="http://www.seumala.com.br">aqui</a>.
/var/www/www.errado.com
veja://errou.orgftp://erroufeiocom
http:/errado.com.br
http://com
boa sorte!
--
s/&:(/&>(/g,aurelio@...
http://www.conectiva.com.br/~aurelio
"indignação_movendo_a_nação"<ESC>:wq
------------------------------------
NOVA! http://www.brasmidia.com/dumbs
arquivo "sed-macho.sh" anexado pros curiosos
[~] . sed-macho.sh
[~] echo seu mala | Direitiza seu mala
[~] echo seu mala | Centraliza
seu mala
[~] echo seu mala | Esquerdiza
seu mala
[~] echo seu mala | Verticaliza
s
e
u
m
a
l
a
[~] echo seu mala | Verticaliza | Centraliza
s
e
u
m
a
l
a
--
s/&:(/&>(/g,aurelio@...
http://www.conectiva.com.br/~aurelio
"indignação_movendo_a_nação"<ESC>:wq
------------------------------------
NOVA! http://www.brasmidia.com/dumbs
consideração interessante sobre a velocidade.
s/[^,]*://
normal.
s/,[^,]*:/,/
este é mais rápido pois de cara, ele já casa uma vírgula, e passa
para a próxima parte, eliminando o trabalho do * de ficar tentando
casar nos caracteres que vêm antes da vírgula.
---------------------------------------------------------------
Date: Fri, 26 Nov 1999 15:40:13 +0000
From: Matthew Winn <matthew@...>
To: VIM <vim@...>
Subject: [vim] Re: Substitute
On Fri, Nov 26, 1999 at 04:29:50PM +0100, Andrzej M. Ostruszka wrote:
> :s/[^,]*://
>
> You're not saying what those strings are composed of so I suppose that
> the answer is "delete non-comma string in front of colon".
:s/,[^,]*:/,/
(Considerably faster.)
--
Matthew Winn (matthew@...)
até hoje não encontrei uma tradução legal para "back
reference". alguém tem alguma sugestão?
para quem não sabe/lembra, isso é o \1, \2
tipo:
\(eu\)\1
casa 'eueu'
s/eu \(não\)/você \1/
troca 'eu não' por 'você não'
back reference é como uma "referência retroativa" ou coisa parecida,
pois primeiro você deve marcar a ER com os ()s e depois você a
referencia usando o \1
alguém?
--
s/:(/:)/;s/:(/:|/;s/:(/>(/,http://www.conectiva.com.br/~aurelio
${linux/gui/},ctrl+a],http://www.brasmidia.com/dumbs<esc>:wq
> > até hoje não encontrei uma tradução legal para "back
> > reference". alguém tem alguma sugestão?
>
> hmmm ?:/
>
> pós-referência ?
>
> tut tut tut tut tut ...
pô, mas pós referência é o contrário!
ele faz uma referência anterior e não pós...
retroativa é bem isso, mas êta palavrinha difícil de lembrar...
--
s/:(/:)/;s/:(/:|/;s/:(/>(/,http://www.conectiva.com.br/~aurelio
${linux/gui/},ctrl+a],http://www.brasmidia.com/dumbs<esc>:wq
Hoje, às 16:08, aurelio marinho jargas - ctba escreveu:
> > > até hoje não encontrei uma tradução legal para "back
> > > reference". alguém tem alguma sugestão?
> >
> > pós-referência ?
>
> pô, mas pós referência é o contrário!
> ele faz uma referência anterior e não pós...
>
> retroativa é bem isso, mas êta palavrinha difícil de lembrar...
sim, retroativa é a mais certa... mas o que é uma pós referência ? uma
referência feita DEPOIS, ou seja, está referenciando algo ANTERIOR...
acho que não estou viajando.
pra bom entendedor, me pa ba. ':)
--
echo Conectiva - Theodoro, Eliphas Levy |
sed 's/\([A-z]*\) - \([A-z]*,\) \([A-z]*\) \([A-z]*\)/\3 \4 \2 \1/'
-----BEGIN GEEK CODE BLOCK-----
Version: 3.12 GCM/U d--- s:- a23 C+++ UL+++$ P+>$ L++> E--- W- N- !o !K w---
O- M- V? PS+ PE Y-- PGP t+ 5+ X+ R+ tv- b DI+ D+++ G e-- h+ r- y+
------END GEEK CODE BLOCK------
Quem gosta de homem é gay, mulher gosta é de dinheiro.
Venha para o Grupo Brasil: http://www.lcg.ufrj.br/seti/
Dae pessoal:
Muitos já se depararam com a necessidade de casar
strings entre aspas, como o "conteudo" de um printf:
printf("blah blah blah]\n");
Até aí tudo bem. O problema aparece quando há outras aspas
dentro da string, como no exemplo abaixo:
printf("esta string tem \"aspas\" dentro dela");
Quem já passou por isso sentiu a dificuldade na carne :-)
Nesse caso, em que só há uma string a casar na linha, o
nosso velho amigo guloso .* pode ser usado, mas quando há
mais strings, aí o bicho pega mesmo! (pega os caracteres
entre as duas strings, que não deveriam ser casados!) :-)
printf ("--->\"x\"<--- "); printf ("--->\"y\"<---\n");
No exemplo acima, um sed 's/".*"/XXXX/' resultaria em:
printf (XXXX);
quando o que a gente gostaria era ter:
printf (XXXX); printf(XXXX);
Bom, a expressão regular (ER) que casa com strings que tem
aspas escapeadas dentro não é fácil de ser "pensada", mas
depois de se entender a linha de pensamento, fica fácil.
Então, vamos lá! O segredo é ter uma expressão regular que
case com qualquer caracter que não seja aspa, mas que também
case com uma aspa escapeada, \" .
1. Uma ER que casa com qualquer caracter diferente de aspas:
[^"]
2. Uma ER que casa com \":
\"
NOTA: eu sei que o certo seria \\", porque a \ tem valor
especial. Eu estou passando por cima disso, para facilitar o
entendimento das ERs, além do fato de que ERs são
artifícios teóricos e, conequentemente, "independentes
de implementação" :-)
3. Uma ER que case com um caracter diferente de ", mas que
case com o \" (uma simples concatencação com | de duas ERs):
(\") | ([^"])
4. Uma ER para casar com uma seqüência de caracteres
diferentes de ", mas com \" dentro dela:
( (\") | ([^"]) )*
5. Para finalizar, vamos casar as aspas iniciais:
" ( (\") | ([^"]) )* "
RACIOCÍNIO:
ER1 = " casa uma "
ER2 = [^"] casa um caracter != "
ER3 = \" casa um \"
ER4 = ER3 | ER2 casa (c != ") ou \"
ER5 = ER4* casa 0 ou mais ER4
ER6 = ER1 ER5 ER1 casa ER5 entre ER1s
A ER que colocariamos em um sed macho para que ele faça o
que a gente quer é:
"\(\(\\"\)\|\([^"]\)\)*"
O sed macho ficaria:
sed -e 's/"\(\(\\"\)\|\([^"]\)\)*"/STRING/g'
NOTA: o "g" no final é para que ele substitua todas as
"...\"..." da frase por STRING, não somente a primeira ;-)
Espero que isso tire a dor de cabeça de muita
gente... :-)))
[]'s
===================================
Luciano Baretta Mandryk
-----------------------------------
baretta@...
mandrius@...
lbm96@...
-----------------------------------
Registered Linux User no. 115.666
===================================
"Principio da Recursividade: Para
entender o principio da recursividade, eh
necessario entender primeiro o principio
da recursividade."
@ 29/11, Luciano Baretta Mandryk:
> Até aí tudo bem. O problema aparece quando há outras aspas
> dentro da string, como no exemplo abaixo:
>
> printf("esta string tem \"aspas\" dentro dela");
massa. essa é bem útil mesmo.
> 3. Uma ER que case com um caracter diferente de ", mas que
> case com o \" (uma simples concatencação com | de duas ERs):
> (\") | ([^"])
só uma economia de quatro caracteres (8 no sed):
a alternação tem precedência pela concatenação, então os parênteses
para agrupar as duas ERs acima citadas não são necessários:
\"|[^"]
> O sed macho ficaria:
>
> sed -e 's/"\(\(\\"\)\|\([^"]\)\)*"/STRING/g'
O sed + macho ainda ficaria: &;)
sed -e 's/"\(\\"\|[^"]\)*"/STRING/g'
> NOTA: o "g" no final é para que ele substitua todas as
> "...\"..." da frase por STRING, não somente a primeira ;-)
ah tá, seu G. &:)
--
s/:(/:)/;s/:(/:|/;s/:(/>(/,http://www.conectiva.com.br/~aurelio
${linux/gui/},ctrl+a],http://www.brasmidia.com/dumbs<esc>:wq
Hoje, às 12:57, aurelio marinho jargas - ctba escreveu:
> @ 29/11, Luciano Baretta Mandryk:
> > Até aí tudo bem. O problema aparece quando há outras aspas
> > dentro da string, como no exemplo abaixo:
> >
> > printf("esta string tem \"aspas\" dentro dela");
> > O sed macho ficaria:
> >
> > sed -e 's/"\(\(\\"\)\|\([^"]\)\)*"/STRING/g'
>
> O sed + macho ainda ficaria: &;)
> sed -e 's/"\(\\"\|[^"]\)*"/STRING/g'
então o sed machão ficaria ';)
sed 's/"\([^"]\|\\"\)*"/"STRING"/g'
pra que o -e ?
e faltou as aspas... não vale falar que você usa printf sem aspas ';)
e... pô aurélio, eu fiquei uns 2 minutos pensando sozinho como fazer isso
(sem colar do baretta) e acabou a ER ficando igual à sua, só que ao
contrário no "ou". a SUA tá errada ':P
--
echo Conectiva - Theodoro, Eliphas Levy |
sed 's/\([A-z]*\) - \([A-z]*,\) \([A-z]*\) \([A-z]*\)/\3 \4 \2 \1/'
-----BEGIN GEEK CODE BLOCK-----
Version: 3.12 GCM/U d--- s:- a23 C+++ UL+++$ P+>$ L++> E--- W- N- !o !K w---
O- M- V? PS+ PE Y-- PGP t+ 5+ X+ R+ tv- b DI+ D+++ G e-- h+ r- y+
------END GEEK CODE BLOCK------
Quem gosta de homem é gay, mulher gosta é de dinheiro.
Venha para o Grupo Brasil: http://www.lcg.ufrj.br/seti/
[...]
>então o sed machão ficaria ';)
>sed 's/"\([^"]\|\\"\)*"/"STRING"/g'
>
>pra que o -e ?
>e faltou as aspas... não vale falar que você usa printf sem aspas ';)
>
Na verdade o sed macho foi originalmente concebido para
trocar as aspas tambem, ou melhor, trocar
printf("foobar");
por
printf(_("foobar));
ou algo do gênero (internacionalização)
>e... pô aurélio, eu fiquei uns 2 minutos pensando sozinho como fazer isso
>(sem colar do baretta) e acabou a ER ficando igual à sua, só que ao
>contrário no "ou". a SUA tá errada ':P
>
Existe um detalhe qdo à ordem no "ou".
Qdo as duas ERs do "ou" casam, o comportamento correto (o
sed faz isso) é escolher a que casa com mais
caracteres. Porém, algumas implementações de ER ignoram esse
detalhe e só tentam casar a segunda ER se a 1a. não
servir. Em casos assim, se você escrever [^"] | \\" o
negócio não vai funcionar, pq a 1a. ER casa com a barra, e a
procura reinicia pela " sozinha, encerrando a procura!
[]'s
===================================
Luciano Baretta Mandryk
-----------------------------------
baretta@...
mandrius@...
lbm96@...
-----------------------------------
Registered Linux User no. 115.666
===================================
"Principio da Recursividade: Para
entender o principio da recursividade, eh
necessario entender primeiro o principio
da recursividade."
Hoje, às 14:40, Luciano Baretta Mandryk escreveu:
> >sed 's/"\([^"]\|\\"\)*"/"STRING"/g'
> Existe um detalhe qdo à ordem no "ou".
> Qdo as duas ERs do "ou" casam, o comportamento correto (o
> sed faz isso) é escolher a que casa com mais
> caracteres. Porém, algumas implementações de ER ignoram esse
> detalhe e só tentam casar a segunda ER se a 1a. não
> servir. Em casos assim, se você escrever [^"] | \\" o
> negócio não vai funcionar, pq a 1a. ER casa com a barra, e a
> procura reinicia pela " sozinha, encerrando a procura!
Xi... agora complicou tudo. Xover se eu entendi:
procuro por algo que não seja " ;
OU
procuro por algo que seja \" ;
1ª:
{
achei uma \ ; continuo porque ela faz parte do segundo OU (o maior) ;
achei uma " ; fechou o OU.
}
2ª:
{
achei uma \ ; não é uma aspa, então fechou e fim de papo.
}
Então o correto é a primeira hipótese, mas alguma máquina de ER usa a
segunda. Tendi ?
--
echo Conectiva - Theodoro, Eliphas Levy |
sed 's/\([A-z]*\) - \([A-z]*,\) \([A-z]*\) \([A-z]*\)/\3 \4 \2 \1/'
-----BEGIN GEEK CODE BLOCK-----
Version: 3.12 GCM/U d--- s:- a23 C+++ UL+++$ P+>$ L++> E--- W- N- !o !K w---
O- M- V? PS+ PE Y-- PGP t+ 5+ X+ R+ tv- b DI+ D+++ G e-- h+ r- y+
------END GEEK CODE BLOCK------
Quem gosta de homem é gay, mulher gosta é de dinheiro.
Venha para o Grupo Brasil: http://www.lcg.ufrj.br/seti/
> > > O sed macho ficaria:
> > > sed -e 's/"\(\(\\"\)\|\([^"]\)\)*"/STRING/g'
> > O sed + macho ainda ficaria: &;)
> > sed -e 's/"\(\\"\|[^"]\)*"/STRING/g'
> então o sed machão ficaria ';)
> sed 's/"\([^"]\|\\"\)*"/"STRING"/g'
>
> pra que o -e ?
é, o -e não precisa mesmo, ele é útil quando seu script sed tem mais
de uma linha, e quando você usa os comandos 'a' e 'i' do sed.
> e... pô aurélio, eu fiquei uns 2 minutos pensando sozinho como fazer isso
> (sem colar do baretta) e acabou a ER ficando igual à sua, só que ao
> contrário no "ou". a SUA tá errada ':P
a minha ER não, a glória é toda do baretta, eu só fiz um ajustezinho
&:)
--
s/:(/:)/;s/:(/:|/;s/:(/>(/,http://www.conectiva.com.br/~aurelio
${linux/gui/},ctrl+a],http://www.brasmidia.com/dumbs<esc>:wq
On Mon, 29 Nov 1999, Eliphas Levy Theodoro wrote:
>Hoje, às 14:40, Luciano Baretta Mandryk escreveu:
>
>> >sed 's/"\([^"]\|\\"\)*"/"STRING"/g'
>
>> Existe um detalhe qdo à ordem no "ou".
>> Qdo as duas ERs do "ou" casam, o comportamento correto (o
>> sed faz isso) é escolher a que casa com mais
>> caracteres. Porém, algumas implementações de ER ignoram esse
>> detalhe e só tentam casar a segunda ER se a 1a. não
>> servir. Em casos assim, se você escrever [^"] | \\" o
>> negócio não vai funcionar, pq a 1a. ER casa com a barra, e a
>> procura reinicia pela " sozinha, encerrando a procura!
>
>Xi... agora complicou tudo. Xover se eu entendi:
>
>procuro por algo que não seja " ;
>OU
>procuro por algo que seja \" ;
>
>1ª:
>{
>achei uma \ ; continuo porque ela faz parte do segundo OU (o maior) ;
>achei uma " ; fechou o OU.
>}
>2ª:
>{
>achei uma \ ; não é uma aspa, então fechou e fim de papo.
>}
>
>Então o correto é a primeira hipótese, mas alguma máquina de ER usa a
>segunda. Tendi ?
>
Acho que sim, é que eu não entendi direito o que tu disse :)
Deixa eu tentar explicar melhor, para acabar de vez com as
dúvidas:
A ER = (\"|[^"]) funciona blz sempre
O problema está na ER = ([^"]|\")
Suponha:
ER = [^"] | \"
Entrada = \"teste
Como o sed "pensa" (CERTO):
ER = A | B:
tenta casar A
tenta casar B
escolhe a que casa mais caracteres
no nosso caso:
casa [^"] com \
casa \" com \"
como \" é maior que \, ([^"]|\") casa com \"
Como alguns outros interpretadores "pensam" (ERRADO):
ER = A | B
tenta casar A
se A nao casou com nada,
tenta casar B
se A casou, com alguma coisa, o resultado é
essa coisa.
no nosso caso:
casa [^"] com \
casou, então o resultado é o \!!!!
Moral da história: colocar as expressões mais específicas
antes (a esquerda do OU)
[]'s
===================================
Luciano Baretta Mandryk
-----------------------------------
baretta@...
mandrius@...
lbm96@...
-----------------------------------
Registered Linux User no. 115.666
===================================
"Principio da Recursividade: Para
entender o principio da recursividade, eh
necessario entender primeiro o principio
da recursividade."
> >e... pô aurélio, eu fiquei uns 2 minutos pensando sozinho como fazer isso
> >(sem colar do baretta) e acabou a ER ficando igual à sua, só que ao
> >contrário no "ou". a SUA tá errada ':P
> >
> Existe um detalhe qdo à ordem no "ou".
> Qdo as duas ERs do "ou" casam, o comportamento correto (o
> sed faz isso) é escolher a que casa com mais
> caracteres. Porém, algumas implementações de ER ignoram esse
> detalhe e só tentam casar a segunda ER se a 1a. não
> servir. Em casos assim, se você escrever [^"] | \\" o
> negócio não vai funcionar, pq a 1a. ER casa com a barra, e a
> procura reinicia pela " sozinha, encerrando a procura!
exato. veja porque:
na bíblia (vulgo Mastering Regular Expressions) diz-se que há duas
regras básicas paras ERs
1. casa o que achar primeiro
prompt$ echo "um dois tres" | sed "s/dois\|um/XXX/"
XXX dois tres
apesar do "dois" estar antes no ou, o "um" vem primeiro no texto
2. quantificadores são gulosos
echo "a:b:c" | sed "s/.*://"
c
o * e o + sempre vão casar a maior quantidade de texto possível
temos os 2 em nosso exemplo:
(\"|[^"])*
e agora, quem é mais forte? | ou *?
devemos ver as precedências:
* tem a maior precedência
concatenação tem a 2ª maior precedência
| tem a menor precedência
por isso (a)|((b)*(c))
é igual a a|b*c
massa né? &:)
--
s/:(/:)/;s/:(/:|/;s/:(/>(/,http://www.conectiva.com.br/~aurelio
${linux/gui/},ctrl+a],http://www.brasmidia.com/dumbs<esc>:wq
> Como o sed "pensa" (CERTO):
> ER = A | B:
> tenta casar A
> tenta casar B
> escolhe a que casa mais caracteres
lembre-se que este "casa mais caracteres" é so por causa do * depois,
pois normalmente é o primeiro que aparecer no texto.
--
s/:(/:)/;s/:(/:|/;s/:(/>(/,http://www.conectiva.com.br/~aurelio
${linux/gui/},ctrl+a],http://www.brasmidia.com/dumbs<esc>:wq
On Mon, 29 Nov 1999, aurelio marinho jargas - ctba wrote:
>
>
>> Como o sed "pensa" (CERTO):
>> ER = A | B:
>> tenta casar A
>> tenta casar B
>> escolhe a que casa mais caracteres
>
>lembre-se que este "casa mais caracteres" é so por causa do * depois,
>pois normalmente é o primeiro que aparecer no texto.
>
>
Nao, o * ainda não entrou na jogada. :-)
Veja que \" sempre casa 2 caracteres, o \ e o ",
enqto [^"] SEMPRE casa só 1 caracter. Por exemplo,
echo xxy | sed 's/\(x\|xx\)/X/'
vai retornar Xy. As implementações erradas de ERs
retornariam Xxy, ou XXy, precisaria testar.
[]'s
===================================
Luciano Baretta Mandryk
-----------------------------------
baretta@...
mandrius@...
lbm96@...
-----------------------------------
Registered Linux User no. 115.666
===================================
"Principio da Recursividade: Para
entender o principio da recursividade, eh
necessario entender primeiro o principio
da recursividade."