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

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

Re: [shell-script] Remover resto da linha


From: Flavio Junior
Subject: Re: [shell-script] Remover resto da linha
Date: Wed, 22 Aug 2007 15:44:17 -0300

hm...
Flavio:
sed -r 's|(^.*\/).*|\1|'

sed = tu já conhece
-r = usar expressoes regulares avançadas
's = operação de substituição
| = Delimitador dos campos, sendo que o primeiro é o SUBSTITUIDO, o segundo
o SUBSTITUTO
(^.*\/) = O que está entre (parenteses) será um conjunto
   ^ = Indica INICIO da linha
   . = indica qualquer caracter (letras,numeros,espaço em branco .....)
   * = indica que o caracter anterior (o . no caso) deverá aparecer zero,
uma ou infinitas vezes
      Resumindo: .* == QUALQUER COISA
   \/ (barra invertida - barra normal) = (Não, usando o -r e | eu não
precisava ter posto a barra invertida) simplesmete diz que é uma barra
normal
   Então - O que temos no conjunto até agora é: (INICIO DE LINHA - QUALQUER
COISA - TERMINANDO COM / )

Pausa:
No seguinte:
[root@ideafix ~]# echo "/usr/share/myspell/dicts/pt_BR.dic" | sed -r
's|(^.*/)||'
pt_BR.dic

Veja, é o mesmo conjunto, dizemos que o nosso conjunto é o SUBSTITUIDO e o
SUBSTITUTO deverá ser "" (vazio)... O que aconteceu foi que só nos sobrou o
nome do arquivo no final, já que nosso conjunto pega QUALQUER COISA DO
INICIO DA LINHA ATÉ UMA / e trocamos ele por vazio...

Voltando:
Fora do conjunto temos outro "QUALQUER COISA"
.* = Qualquer coisa
  Ou seja, nosso SUBSTITUIDO acabou abrangendo a linha inteira, já que com o
conjunto pegamos até a "/" final e depois ainda pegamos qualquer coisa ...
| = Final do SUBSTITUIDO
\1 = É como chamamos um conjunto, o nome disso é "retrovisores" (\#) ... No
caso, \1 é "Retorne o PRIMEIRO conjunto" e então isso fica como nosso
SUBSTITUTO, e traz somente o nome do diretorio, que é o que o conjunto
especifica...

Se houvesse varios conjuntos:
[root@ideafix ~]# echo "/usr/share/myspell/dicts/pt_BR.dic" | sed -r
's|(^.*/)(.*$)|Conjunto 1: \1 - Conjunto 2: \2|'
Conjunto 1: /usr/share/myspell/dicts/ - Conjunto 2: pt_BR.dic

Veja que só adicionei o q tava fora do conjunto ali pra dentro de um segundo
conjunto..
E o "$" ali significa final de linha..
Então eu disse que o Segundo Conjunto vai do FINAL DO PRIMEIRO CONJUNTO -
QUALQUER COISA ATÉ O FINAL DE LINHA
Que no caso do echo ali é o nome do arquivo..


Espero ter deixado claro isso..

Voce viu que no do Julio e Tiago cada um usou um "separador", SIM é possivel
usar varios separadores como melhor lhe couber na ocasião da regex...

[root@ideafix ~]# echo NADA | sed 'sCACXC'
NXDA
[root@ideafix ~]# echo NADA | sed 'sCACXCg'
NXDX

o "g" no final ali diz pra atuar em todas as ocorrencias do SUBSTITUIDO
durante a LINHA... sem o "g" ele só atua na primeira, ou especifica um
numero:

[root@ideafix ~]# echo NADA | sed 'sCACXC2'
NADX



Tae, meus 10 cents...


Flávio do Carmo Junior


On 8/22/07, Élvio Barbalho <address@hidden> wrote:
>
>   Senhores, adorei as soluções que foram apresentadas, entretanto não
> consegui
> entender nenhuma!!!!
>
> Poderiam me explicar detalhadamente cada uma delas???
>
> Thiago
> sed 's|/[^/]\+$|/|'
>
> Flavio
> sed -r 's|(^.*\/).*|\1|'
>
> Julio
> sed 's#.* ##;s#^\(.*\)/.*$#\1/#'
>
> ----- Mensagem original -----
> De: address@hidden <shell-script%40yahoogrupos.com.br>
> [SMTP:address@hidden <shell-script%40yahoogrupos.com.br>]
> Em nome de Julio C. Neves
> Enviada em: quarta-feira, 22 de agosto de 2007 14:55
> Para: address@hidden <shell-script%40yahoogrupos.com.br>
> Assunto: Re: [shell-script] Remover resto da linha
>
> Fala Salviano,
> com o sed como vc pediu:
> $ dpkg --search pt_BR.dic pt_BR.aff | sed 's#.*
> ##;s#^\(.*\)/.*$#\1/#'
> Abraços,
> Julio
>
> Em 22/08/07, Salviano A. Leão < address@hidden<salvianoleao%40yahoo.com.br>
> <mailto:salvianoleao%40yahoo.com.br> > escreveu:
> >
> > Olá a todos,
> >
> > Estou com seguinte problema. O comando abaixo
> > $ dpkg --search pt_BR.dic pt_BR.aff | cut -f2 -d " "
> > fornece o seguite resultado
> > /usr/share/myspell/dicts/pt_BR.dic
> > /usr/share/apps/koffice/hyphdicts/hyph_pt_BR.dic
> > /usr/lib/scribus-ng/dicts/hyph_pt_BR.dic
> > /usr/lib/scribus/dicts/hyph_pt_BR.dic
> > /usr/share/myspell/dicts/hyph_pt_BR.dic
> > /usr/share/myspell/dicts/pt_BR.aff
> >
> > Gostaria de eliminar tudo que está apos a última /
> > ficando assim:
> > /usr/share/myspell/dicts/
> > /usr/share/apps/koffice/hyphdicts/
> > /usr/lib/scribus-ng/dicts/
> > /usr/lib/scribus/dicts/
> > /usr/share/myspell/dicts/
> > /usr/share/myspell/dicts/
> >
> > Minha tentativa foi fazendo:
> >
> > $ dpkg --search pt_BR.dic pt_BR.aff | cut -f2 -d " " | sed
> 's#/#\n#g;'|
> > sed '/\.dic$/d; /\.aff$/d;' | tr "^\n" "/" | sed "s#//#\n/#g"
> >
> > ficou grande, desajeitado e ainda está eliminando a última barra.
> É
> > simples
> > mas como já encontrei situações semelhantes.
> >
> > Acredito que com o sed deve haver um modo mais direto.
> >
> > O problema poderia ser resolvido como cut se todos eles tivessem o
> mesmo
> > número de /.
> >
> > Obrigado
> >
> >
> >
>
> --
> Abraços,
> Julio
> http://www.julioneves.com <http://www.julioneves.com> - Um livro
> sobre Bash completo e on-line
> :wq
>
> [As partes desta mensagem que não continham texto foram removidas]
>
>
>
>
>  
>


[As partes desta mensagem que não continham texto foram removidas]



reply via email to

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