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

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

Re: [shell-script] Ajuda com ER


From: Julio C. Neves
Subject: Re: [shell-script] Ajuda com ER
Date: Mon, 10 Jan 2011 11:34:06 -0200

Fala Cristiano,
o macete é primeiramente excluir o que está após o segundo traço. Veja:

$ echo "3-1872-1
3-1874-1
4890-1
1901-1
2-1367-1
1-1891-1
1-1892-1
3-1900-1
900-1373-1
1907-1
1908-1
900-111-1
3-1920-1" | sed -r 's/-[0-9]+$//;s/[0-9]+-//'
1872
1874
4890
1901
1367
1891
1892
1900
1373
1907
1908
111
1920

Abcs,
Julio


Em 10 de janeiro de 2011 10:28, Cristiano <address@hidden> escreveu:

>
>
> Salve lista, bom 2011 a todos!
>
> Preciso de ajuda para melhorar uma ER utilizada no comando de substituição
> do sed.
>
> Tenho uma lista com o seguinte padrão:
>
> (...)
> 3-1872-1
> 3-1874-1
> 4890-1
> 1901-1
> 2-1367-1
> 1-1891-1
> 1-1892-1
> 3-1900-1
> 900-1373-1
> 1907-1
> 1908-1
> 900-111-1
> 3-1920-1
> (...)
>
> O padrão é o seguinte:
>
> 1) todos os registros terminam com '\-[0-9]', necessariamente.
> 2) os registros podem começar com '[0-9]*\-' **ou não**.
>
> Preciso de uma ER, para ser usada no s do sed com um grupo, que case com os
> padrões do final e do começo, removendo-os, de modo a retornar apenas o
> bloco do meio. A lista acima deveria ficaria assim, após o processamento com
> o sed:
>
> (...)
> 1872
> 1874
> 4890
> 1901
> 1367
> 1891
> 1892
> 1900
> 1373
> 1907
> 1908
> 111
> 1920
> (...)
>
> A ER que usei para casar o que será removido referente ao padrão do final
> da linha é a seguinte:
>
> '\-[^-]*$'
>
> Até aí, tudo OK. O problema é a ER para casar o padrão a ser removido no
> início da linha. Inicialmente tentei isso:
>
> '^[^-]*\-'
>
> Então, o comando sed ficaria:
>
> sed 's/\(^[^-]*\-\|\-[^-]*$\)//g' lista.txt
>
> Funciona parcialmente. Nas linha que possuem os dois padrões, no início e
> no fim, OK. Já nas linhas que **não possuem** o padrão a remover no início
> (apenas o do final), ela casa com o conteúdo que deveria retornar.
>
> Por exemplo, as linhas:
>
> (...)
> 4890-1
> 1901-1
> (...)
> 1907-1
> 1908-1
> (...)
>
> que deveriam retornar
>
> (...)
> 4890
> 1901
> (...)
> 1907
> 1908
> (...)
>
> retornam
>
> (...)
> 1
> 1
> (...)
> 1
> 1
> (...)
>
> pois não há o padrão do inicio da linha para casar com a primeira ER.
>
> Então ela casa com o conteúdo que deveria retornar, pois o '-' do padrão do
> fim do arquivo faz com que a primeira ER do grupo case com o que não deve,
> quando não há o primeiro padrão.
>
> A solução que encontrei foi executar o sed em 2 etapas, primeiro removendo
> o padrão do fim do arquivo -> sed 's/\-[^-]*$//g'.
>
> Depois, executo o sed novamente, desta vez para remover o padrão do início
> do arquivo -> sed 's/^[^-]*\-\//g'. Como não há nenhuma linha que contenha o
> "-" para casar, caso o padrão do início do arquivo não exista, ele remove
> corretamente o que desejo, retornando a lista correta.
>
> O problema é que eu gostaria de uma ER que fizesse isso utilizando o sed
> apenas 1 vez, aproveitando os conceitos de "OU" e de grupos.
>
> Dá para melhorar esta ER para fazer isso ou o único jeito é rodar o sed em
> 2 etapas?
>
>  
>


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



reply via email to

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